sort query new examples example column hibernate orm jpa sql-order-by jpql

hibernate - query - order by jpql



JPQL cláusula ORDER BY con parámetro (4)

El "ASC" o "DESC" no pueden ser un parámetro de consulta. Podrías usar concatenación de cuerdas en su lugar.

query = "SELECT c FROM item ORDER BY c.name " + sortOrder;

Debe validar que el contenido de sortOrder solo puede ser ASC o DESC y no proviene directamente del usuario.

Estoy tratando de escribir una consulta de JPQL 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 "ASC" o "DESC":

query = "SELECT c FROM item ORDER BY c.name :order"

Y luego en mi implementación:

query.setParameter("order", "ASC");

Esto es cuando recibo un error de hibernación:

org.hibernate.HibernateException: Errors in named queries

¿Alguna idea de lo que estoy haciendo mal? ¡Gracias!


En lugar de escribir dos veces una consulta con nombre que contenga una cláusula ''ordenar por'', 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; }


Si desea utilizar consultas con nombre aquí, necesitará dos de ellas (las consultas con nombre son estáticas y no puede usar ASC y DESC como parámetro como lo señala @Mark).


Supongo que la forma correcta es usar la cláusula ORDER BY de la API de criterios

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")));