2010-09-01 23 views
16

Estoy intentando escribir una JPQL consulta con una cláusula ORDER BY:JPQL cláusula ORDER BY con el parámetro

query = "SELECT c FROM item ORDER BY c.name ASC" 

me gustaría establecer un parámetro de "orden", cuyo valor podría ser "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 

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

Respuesta

17

El "ASC" o "DESC" no puede ser un parámetro de consulta. Puede usar la concatenación de cadenas en su lugar.

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

debe validar que el contenido de sortOrder sólo pueden ser ASC o DESC y no viene directamente del usuario.

+1

bien que explica muchas cosas. ¿Hay alguna forma de usar una concatenación de cadenas en la declaración de @NamedQuery? –

+0

bien, gracias de todos modos! –

7

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

+0

¿O supongo que podría usar una consulta dinámica? –

+0

@Pedro Sure. Pero eso no será un @NamedQuery (en realidad estaba respondiendo uno de tus comentarios). –

+0

Tienes razón. Pero la verdad es que tengo bastantes consultas con nombre que deben ser ordenadas, por lo que la creación de 2 consultas para cada uno dará como resultado el doble de consultas con nombre. ¿Es eso un problema? ¿O debería usar consultas dinámicas en su lugar? –

5

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; 
} 
+6

Esto puede no ser aplicable si la 'paginación' entra en juego. –

+1

Solo una nota para decir que siempre es mejor ordenar en la base de datos que en el código donde es posible. – karol

Cuestiones relacionadas