2010-05-19 12 views
5

¿Los alias de proyección de Hibernate funcionan? Podría jurar que simplemente no. Al menos, no hace lo que esperaría que hiciera.Criterio de hibernación Alias ​​de proyección no se usa

Aquí es el java:

return sessionFactory.getCurrentSession() 
    .createCriteria(PersonProgramActivity.class) 
    .setProjection(Projections.projectionList() 
     .add(Projections.alias(Projections.sum("numberOfPoints"), "number_of_points")) 
     .add(Projections.groupProperty("person.id"))) 
    .setFirstResult(start) 
    .setFetchSize(size) 
    .addOrder(Order.desc("numberOfPoints")) 
    .list(); 

Aquí es el SQL que se genera:

select 
    sum(this_.number_of_points) as y0_, 
    this_.person_id as y1_ 
from 
    PERSON_PROGRAM_ACTIVITY this_ 
group by 
    this_.person_id 
order by 
    this_.number_of_points desc 

No parece usar el alias en absoluto. Creo que configurar el alias significaría que sum(this_.number_of_points) se alias como number_of_points y no y0_. ¿Hay algún truco que me falta?

Gracias.

Respuesta

6

Debe dar un alias a todos los criterios, luego puede crear otros alias que realmente se usen. Lo extraño es que los alias se convierten en y0_ en lugar de al revés.

return sessionFactory.getCurrentSession() 
    .createCriteria(PersonProgramActivity.class, "ppa") 
    .setProjection(Projections.projectionList() 
     .add(Projections.alias(Projections.sum("numberOfPoints"), "ppa.numberOfPoints")) 
     .add(Projections.groupProperty("person.id"))) 
    .setFirstResult(start) 
    .setFetchSize(size) 
    .addOrder(Order.desc("ppa.numberOfPoints")) 
    .list(); 

genera el siguiente código SQL:

select 
    sum(this_.number_of_points) as y0_, 
    this_.person_id as y1_ 
from 
    PERSON_PROGRAM_ACTIVITY this_ 
group by 
    this_.person_id 
order by 
    this_.y0_ desc 
+0

+1 que he visto este tipo de cosas así, creo que con subconsultas. – Justin

1

La consulta debe ser

return sessionFactory.getCurrentSession() 
    .createCriteria(PersonProgramActivity.class, "ppa") 
    .setProjection(Projections.projectionList() 
     .add(Projections.alias(Projections.sum(**"ppa.numberOfPoints"**), **"numberOfPoints"**)) 
     .add(Projections.groupProperty("person.id"))) 
    .setFirstResult(start) 
    .setFetchSize(size) 
    .addOrder(Order.desc("ppa.numberOfPoints")) 
    .list(); 
Cuestiones relacionadas