2010-05-19 57 views
5

Hibernate投影別名是否正常工作?我可以發誓它沒有。至少,它不會做我期望的事情。休眠條件未使用投影別名

這裏是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(); 

下面是它生成的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_.number_of_points desc 

它似乎並沒有使用別名在所有。我認爲設置別名將意味着sum(this_.number_of_points)將被別名爲number_of_points而不是y0_。有一些我不知道的技巧嗎?

謝謝。

回答

6

你需要給整個標準一個別名,然後你可以創建其他的實際使用的別名。奇怪的是,別名變成了y0_而不是其他的方式。

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

生成以下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我見過這種東西爲好,我想與子查詢。 – Justin 2010-05-19 21:36:52

1

查詢應該是

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