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!

¿Fue útil?

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")));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top