¿Cómo unirse a columnas unnest utilizando JPQL?
Tengo una consulta sencilla que me gustaría traducir a JPQL / Hibernate. Estoy utilizando Postgres 14.
La consulta real es un poco más complicada y utilizará la nueva columna y la unirá con columnas existentes.
Actualmente estoy utilizando una nativeQuery
, pero idealmente me gustaría poder prescindir de ella. Así que intenté algunas cosas pero no pude encontrar una solución.
En primer lugar, intenté registrar unnest
como una función.
public class Contributor implements MetadataBuilderContributor {
@Override
public void contribute(MetadataBuilder metadataBuilder) {
metadataBuilder.applySqlFunction(
"unnest",
new StandardSQLFunction("unnest", StandardBasicTypes.CHARACTER_ARRAY)
);
}
}
Sin embargo, obtengo el siguiente error:
antlr.MismatchedTokenException: expecting CLOSE, found ‘[‘
Parece que hay un problema con cast()
. Así que intenté algo más simple solo para revisar la sintaxis.
@Query("select unnest(:vals)")
List<mydto> hello(List<string> vals);
Aquí obtengo otro error.
org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected end of subtree
Intenté más variaciones y también algo como function('unnest', :vals)
, pero nada funcionó.
¿Alguna idea de cómo hacerlo funcionar? ¡Muchas gracias!
davy.ai
Para traducir la consulta SQL dada a JPQL/Hibernate, puedes utilizar el siguiente código:
Aquí,
TableName
representa el nombre de la tabla ycolumnAlias
representa el alias de la nueva columna creada por la funciónUNNEST
. Las palabras claveDISTINCT VALUE
se utilizan para eliminar cualquier duplicado que pueda surgir debido a la desanidación del array.En el método
getResult
, el parámetroarrayParam
se convierte en un array de texto y se aplica la funciónUNNEST
en él para crear una nueva columna con el aliascolumnAlias
. A continuación, se unen esta nueva columna con las columnas existentes de la tablaTableName
y se devuelve el resultado como una lista de cadenas.Ten en cuenta que este código asume que la clase
MyDTO
tiene un campo de tipo cadena en el que se puede almacenar el resultado.En cuanto a los problemas que surgen al intentar registrar
unnest
como una función, el tipoStandardBasicTypes.CHARACTER_ARRAY
puede no ser compatible con Postgres 14. Puedes intentar usar en su lugar el tipoStandardBasicTypes.STRING
. Además, en lugar de registrar la funciónunnest
, puedes utilizar directamente la palabra claveUNNEST
en la consulta de JPQL como se muestra arriba.