2012-05-17 34 views
7

Tôi có hai thực thể là Cá nhân và Hoạt động. Hoạt động có trạng thái thuộc tính và thực thể Person chứa tập hợp các hoạt động. Tôi muốn có danh sách những người có tất cả các hoạt động có trạng thái 'Xong'.Hibernate kiểm tra tất cả các phần tử bằng nhau trong bộ sưu tập

Criteria crit = s.createCriteria(Person.class); 
    crit.createAlias("activities", "act").add(Restrictions.eq("act.status","Done")); 

Nhưng điều này trả về tất cả đối tượng có ít nhất một hoạt động có trạng thái được thực hiện. Tôi muốn lấy lại danh sách người có tất cả trạng thái hoạt động được đặt thành Xong. Ai giúp tôi với?

Trả lời

0

Hãy suy nghĩ về việc phủ nhận điều đó. Truy xuất những người có hoạt động và không có hoạt động nào ở trạng thái khác nhau của Done. Sau đó, bạn có thể chỉ cần thêm maxResults() hoặc list.get(0) (Lưu ý rằng có thể không chứa người).

1
// open hibernate session 
Query query = session.createQuery("Select p from Persons p inner join p.activities a where a.status = :code"); 
query.setParameter("code", "Done"); 
List results = query.list(); 

// close session 

for (int i = 0; i < results.size();){ 
    Person person = results.get(i); 
    List<Activity> activities = person.getActivities(); 
    for (int j = 0; j < activities.size(); j++){ 
    if (!activities.code.equals("Done")){ 
     results.remove(i); 
     break; 
    } // end if 
    } // end for j 
    i++; 
} // end for i 

Điều này cần thực hiện thủ thuật. Lưu ý rằng nếu bạn có tải chậm, bạn có thể cần thêm từ khóa "tìm nạp" trong truy vấn Hibernate của mình. Dưới đây là một liên kết hữu ích cho gia nhập: http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html#queryhql-joins

0

Đây là cách bạn có thể làm điều đó với Tiêu chuẩn:

Criteria crit = s.createCriteria(Person.class); 

DetachedCriteria sub = DetachedCriteria.forClass(Person.class); 
sub.createAlias("activities","act"); 
sub.add(Restrictions.ne("act.status","Done")); 
sub.setProjection(Projections.property("id"); 

crit.add(Property.forName("id").notIn(sub); 

Kinda muộn nhưng tôi hy vọng tôi có thể giúp ai đó vẫn đấu tranh với điều này như tôi đã làm .

Các vấn đề liên quan