Buenas,
Estoy probando de crear una vista de una tabla, para luego ordenar el resultado que determine el Select esa vista.
Esto es asi por que originalmente el Select terminaba con una clausula Order By lo que daba como resultado que
la consulta se demorara mucho unos 17 segundos, sacando la clausula Order By se demora 2 segundos.
Probé haciendo una vista en SQL (con el SQL que arma EclipseLink) de la tabla y ordenar esa vista y se demora 2 segundos.
Pero cuando trato de armar la vista en JPA me da un error, lo que no encuentro o no se si JPA soporta Vista.
em.createQuery("SELECT gv"
+ " FROM GestionValidacion gv, IN (gv.gestionValidacionSector) gvs"
+ " WHERE gvs.numeroGestionSector = (SELECT MAX (gvs1.numeroGestionSector)"
+ " FROM GestionValidacion gv1, IN (gv1.gestionValidacionSector) gvs1"
+ " )"
+ " ORDER BY gv.numeroGestionValidacion").
setParameter("idSector", idSector).
setFirstResult(inicio).
setMaxResults(cantidadRegistros).
getResultList();
Necesito que esa consulta se demore poco, alguien tiene alguna idea. Entra pr indices quiere decir que el problema
de la demora pasa por el Order BY.
Alguien tiene alguna idea que me ayude. Estuve pensando utilizar el operador JPQL NEW de JPA 2.0 pero busco otras alternativas.
Esta es la consulta en JPA que me da el error: (SELECT......), line 1, column 17: unexpected token [(].
No le gustan los paréntesis en el FROM
em.createQuery("SELECT gv2"
+ " FROM (SELECT
gv.id as id"
+ " FROM GestionValidacion gv, IN (gv.gestionValidacionSector) gvs"
+ " WHERE gvs.numeroGestionSector = (SELECT MAX (gvs1.numeroGestionSector) "
+ " FROM GestionValidacion gv1, IN (gv1.gestionValidacionSector) gvs1"
+ " )"
+ " ) vista, GestionValidacion gv2"
+ " ORDER BY gv.numeroGestionSector").
setParameter("idSector", idSector).
setFirstResult(inicio).
setMaxResults(cantidadRegistros).
getResultList();
Este es el SQL que funciona con la vista
SELECT
G.*
FROM ( SELECT
t1.ID
FROM GESTIONVALIDACION_GESTIONVALIDACIONSECTOR t3, SECTOR t2, GESTIONVALIDACION t1, GESTIONVALIDACIONSECTOR t0
WHERE (((t0.NUMEROGESTIONSECTOR = (SELECT MAX(t4.NUMEROGESTIONSECTOR)
FROM GESTIONVALIDACION_GESTIONVALIDACIONSECTOR t7, GESTIONVALIDACION t6, GESTIONVALIDACION t5, GESTIONVALIDACIONSECTOR t4
WHERE (((t5.ID = t6.ID)
AND (t1.ID = t6.ID))
AND ((t7.GestionValidacion_ID = t5.ID)
AND (t4.ID = t7.gestionValidacionSector_ID)))))
AND (t2.ID = 'idSectorDefecto6d4501af-7990-4cec-9106-6a5063b21c98'))
AND (((t3.GestionValidacion_ID = t1.ID)
AND (t0.ID = t3.gestionValidacionSector_ID))
AND (t2.ID = t0.SECTORDERIVADO_ID)))
) VISTA, GESTIONVALIDACION G,
WHERE VISTA.id = G.id
ORDER BY G.NUMEROGESTIONVALIDACION;