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)
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 columnacondition_set_ids
.