2010-05-19 7 views
5

Gli alias di Hibernate Projection funzionano anche? Potrei giurarlo, semplicemente no. Almeno, non fa quello che mi aspetterei che faccia.Criterio di ibernazione Alias ​​di proiezione non utilizzato

Ecco il 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(); 

Ecco l'SQL che esso 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 

Non sembra utilizzare l'alias a tutti. Potrei pensare che impostare l'alias significherebbe che sum(this_.number_of_points) sarebbe aliasato come number_of_points e non y0_. C'è qualche trucco che mi manca?

Grazie.

risposta

6

è necessario dare tutti i criteri un alias, quindi è possibile creare altri alias che in realtà si abitua. Ciò che è strano è che gli alias vengono trasformati in y0_ invece del contrario.

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 il seguente 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 Ho visto questo genere di cose così, penso che con sottoquery. – Justin

1

La query dovrebbe essere

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();