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 usar un tipo de biblioteca de ‘Hibernate Types’ en una única consulta nativa que seleccione matrices de Postgres?

Tengo una consulta que devuelve un array de UUID de Postgres:

SELECT e.id, e.date,
ARRAY
(
 SELECT cs.apiid FROM eventconditionset ecs
 JOIN conditionset cs on cs.id = ecs.conditionsetid
 WHERE ecs.eventid = e.id
) AS conditionset_ids,
...

Y luego creo y ejecuto esta consulta como una consulta nativa: Query query = entityManager.createNativeQuery(queryString);

Dado que Hibernate por lo general no puede manejar estos arreglos de Postgres, utilizo la biblioteca Hibernate Types de Vlad.

Sin embargo, actualmente necesito registrar este UUIDArrayType globalmente en mi aplicación:

public class PostgreSQL95CustomDialect extends PostgreSQL95Dialect {

public PostgreSQL95CustomDialect() {
    super();
    this.registerHibernateType(Types.ARRAY, UUIDArrayType.class.getName());
}


}

Además del hecho de que esto es un poco feo, también no deja espacio para otro tipo de arreglos.

(Nota: también intenté registrar un ListArrayType genérico, pero esto arroja una NullPointerException durante la ejecución de la consulta).

También he intentado registrarlo como un tipo escalar:

query.unwrap(org.hibernate.query.NativeQuery.class)
.addScalar(“condition_set_ids”, UUIDArrayType.INSTANCE);

Pero esto hace que toda la consulta devuelva solo un UUID, lo que es muy extraño y parece tener un error.

¿Hay alguna manera de utilizar SOLO este UUIDArrayType específicamente en esta consulta?

(Por favor, no sugiera utilizar array_agg porque el rendimiento es terrible para este caso)

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes utilizar el UUIDArrayType específicamente en esta consulta. Puedes registrar el tipo como un tipo escalar para la consulta, de la siguiente manera:

    query.unwrap(org.hibernate.query.NativeQuery.class)
    .addScalar("condition_set_ids", UUIDArrayType.INSTANCE);

    Esto asegurará que la consulta solo devuelva el UUIDArrayType para la columna condition_set_ids.

Comments are closed.