2010-05-19 4 views
5

Funktionieren Hibernate-Projektionsalias überhaupt? Ich könnte schwören, dass es einfach nicht stimmt. Zumindest tut es nicht, was ich von ihm erwarte. HierHibernate-Kriterium Projektionsalias wird nicht verwendet

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

Hier ist die SQL, die es erzeugt:

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 

Es ist nicht das Alias ​​scheint überhaupt zu benutzen. Ich würde denken, die Einstellung des Alias ​​würde bedeuten, dass sum(this_.number_of_points) Alias ​​als number_of_points und nicht y0_ werden würde. Gibt es einen Trick, den ich vermisse?

Danke.

Antwort

6

Sie müssen den gesamten Kriterien einen Alias ​​geben, dann können Sie andere Aliase erstellen, die tatsächlich verwendet werden. Was merkwürdig ist, ist, dass die Aliase in y0_ umgewandelt werden und nicht umgekehrt.

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

generiert die folgende 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 i als auch diese Art der Sache gesehen habe, denke ich mit Subqueries. – Justin

1

Die Abfrage sollte

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