2010-11-23 19 views
7

Tengo varios NamedQuery definidos, y me gustaría poder ordenar dinámicamente en un campo para una entidad, sin tener que crear NamedQuery únicos para cada campo que quiera ordenar. Por ejemplo:ordenando dinámicamente un NamedQuery? Seam/Hibernate/JPA

Tengo una entidad llamada MyObject, con los campos 'a', 'b' y 'c'. Mi consulta base es "SELECT DISTINCT o FROM MyObject o", pero me gustaría poder agregar una cláusula ORDER BY a mi consulta. Idealmente, me gustaría ser capaz de hacer algo como parámetros con nombre, donde mi consulta sería el resultado:

SELECT DISTINCT o FROM MyObject o ORDER BY :order 

Me continuación, especifique el campo (a, b, c) que desee ordenar. ¿Hay alguna forma de lograr esto usando Seam/Hibernate/JPA? ¿Hay una mejor estrategia para abordar esto?

+1

Esta pregunta está relacionada con [Hibernate named query order by parameter] (http://stackoverflow.com/questions/4120388/hibernate-named-query-order-by-partameter). Quizás la respuesta correspondiente te ayude. – kraftan

Respuesta

5

Las consultas con nombre no se pueden cambiar en tiempo de ejecución.

// ----- Editado partes

public void getOrders(String orderByElement){ 

    String query = "SELECT DISTINCT o FROM MyObject o ORDER BY " + orderByElement; 

    entityManager.createQuery(query).getResultList(); 
} 

Su específica APP.

+0

Eso es exactamente lo que estaba buscando. Pero, ¿la consulta que proporcionó funcionaría si la especificara como JPA @NamedQuery? ¿O solo funcionaría cuando se crea con entityManager.createQuery? No puedo pensar en ninguna razón por la que no, pero solo quiero asegurarme. – Shadowman

+0

No creo que esta solución funcione. De acuerdo con la [Referencia del lenguaje JPQL] (http://download.oracle.com/docs/cd/E11035_01/kodo41/full/html/ejb3_langref.html#ejb3_langref_input_params), los parámetros de entrada solo se permiten en 'WHERE' y' HAVING' cláusulas. ¿Has probado esa consulta? – kraftan

+0

Edité mi respuesta en consecuencia. –