es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para traducir la consulta SQL dada a JPQL/Hibernate, puedes utilizar el siguiente código:

    @Query("SELECT DISTINCT VALUE(columnAlias) FROM TableName t, UNNEST(CAST(:arrayParam AS text[])) AS columnAlias")
    List<string> getResult(@Param("arrayParam") String[] arrayParam);
    

    Aquí, TableName representa el nombre de la tabla y columnAlias representa el alias de la nueva columna creada por la función UNNEST. Las palabras clave DISTINCT VALUE se utilizan para eliminar cualquier duplicado que pueda surgir debido a la desanidación del array.

    En el método getResult, el parámetro arrayParam se convierte en un array de texto y se aplica la función UNNEST en él para crear una nueva columna con el alias columnAlias. A continuación, se unen esta nueva columna con las columnas existentes de la tabla TableName 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 tipo StandardBasicTypes.CHARACTER_ARRAY puede no ser compatible con Postgres 14. Puedes intentar usar en su lugar el tipo StandardBasicTypes.STRING. Además, en lugar de registrar la función unnest, puedes utilizar directamente la palabra clave UNNEST en la consulta de JPQL como se muestra arriba.

Comments are closed.