2010-03-03 17 views
6

Tengo una tabla Jugador con identificaciones de columnas, nombre, victorias, juegos jugados. Lo mapeé a un jugador de clase. quiero hacer la siguiente consulta en Hibernate (preferiblemente con criterios, si no es posible con los Criterios HQL también ayudará)Ordenar los resultados por valor calculado en Hibernate

seleccionar * de orden de juego por (victorias/ games_played)

I espere obtener la lista <Player> ordenada por su proporción de victorias.

Gracias por la respuesta

Palo

Respuesta

9

Hibernate no admite expresiones de aritmética en la cláusula order by. Citando la sección 14.12. The group by clause de la documentación de Hibernate:

Ni la cláusula group by ni la cláusula order by pueden contener expresiones aritméticas.

Y, en efecto, la siguiente consulta HQL no volverá adecuadamente ordenado resultados:

select p from Player p order by (p.wins/p.gamesPlayed) 

Y no creo que se pueda dividir org.hibernate.criterion.Property lo que la API Criterios no va a resolver esto.

así que te sugiero utilizar un atributo calculado (con una fórmula), por ejemplo, con las anotaciones:

private float wins; 
private float gamesPlayed; 
@Formula(value = "WINS/GAMESPLAYED") 
private float ratio; 

Esto permitiría la siguiente consulta con la API Criterios:

session.createCriteria(Player.class).addOrder(Order.desc("ratio")) 
+1

Esto también funciona en .NET con un mapeo fluido usando el método de Fórmula(). – andypaxo

2

De la documentación de Hibernate -

funciones SQL y funciones de agregado están permitidos en el tener y el orden de las cláusulas si son compatibles con la base de datos subyacente .

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-ordering

que significa que necesita para hacerlo sobre la base de su base de datos subyacente.

+1

Gracias usted por la respuesta. ¿Tienes alguna idea de cómo hacer esto con Criteria? – Palo

+0

-1: la pregunta es acerca de * expresiones aritméticas * (y no funciones de SQL o funciones de agregado) que ** NO ** son compatibles con el orden por. –

Cuestiones relacionadas