cláusula JPQL ORDER BY con el parámetro
-
26-09-2019 - |
Pregunta
Estoy intentando escribir una JPQL consulta con una cláusula ORDER BY:
query = "SELECT c FROM item ORDER BY c.name ASC"
Me gustaría establecer un parámetro de "orden", cuyo valor sería ya sea "ASC" o "DESC":
query = "SELECT c FROM item ORDER BY c.name :order"
Y luego en mi aplicación:
query.setParameter("order", "ASC");
Esto es cuando me sale un error de hibernación:
org.hibernate.HibernateException: Errors in named queries
Cualquier idea de lo que estoy haciendo mal? Gracias!
Solución
El "ASC" o "DESC" no puede ser un parámetro de consulta. Se podría utilizar la concatenación de cadenas en su lugar.
query = "SELECT c FROM item ORDER BY c.name " + sortOrder;
Se debe validar que el contenido de sortOrder
sólo pueden ser ASC o DESC y no viene directamente del usuario.
Otros consejos
Si desea utilizar consultas con nombre aquí, se necesitaría dos de ellos (consultas con nombre son estáticos y no se puede utilizar ASC y DESC como parámetro como a cabo en punta por @ Marcos).
En lugar de escribir dos veces a la consulta con nombre que contiene un "orden por cláusula, puede implementar su DAO de esta manera:
public List<MyEntity> findByAttribute(boolean desc,...){
TypedQuery<MyEntity> q = em.createNamedQuery(...
q.setParameter(...
List<MyEntity> result = q.getResultList();
if(desc){
Collections.reverse(result );
}
return result;
}
supongo manera correcta está utilizando cláusula ORDER BY de la API Criteria
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Country> q = cb.createQuery(Country.class);
Root<Country> c = q.from(Country.class);
q.select(c);
q.orderBy(cb.asc(c.get("currency")), cb.desc(c.get("population")));