2010-05-19 24 views
5

Các bí danh Chiếu Hibernate có hoạt động không? Tôi có thể thề là không. Ít nhất, nó không làm những gì tôi mong đợi nó sẽ làm.Tiêu chí ngủ đông Bí danh chiếu không được sử dụng

Đây là 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(); 

Đây là SQL mà nó tạo ra:

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 

Nó dường như không sử dụng bí danh nào cả. Tôi nghĩ rằng việc đặt bí danh sẽ có nghĩa là sum(this_.number_of_points) sẽ được đặt bí danh là number_of_points chứ không phải là y0_. Có một số mẹo tôi đang thiếu?

Cảm ơn.

Trả lời

6

Bạn cần cung cấp cho toàn bộ tiêu chí một bí danh, sau đó bạn có thể tạo các bí danh khác thực sự được sử dụng. Điều kỳ lạ là các bí danh được biến thành y0_ thay vì cách khác.

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

Tạo SQL sau đây:

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 tôi đã nhìn thấy loại điều là tốt, tôi nghĩ rằng với truy vấn con. – Justin

1

Truy vấn nên

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(); 
Các vấn đề liên quan