2010-05-21 27 views
7

Câu hỏi này rất giống với this one nhưng câu trả lời là tối thiểu cho câu hỏi đó.Truy vấn tiêu chí Hibernate để đối sánh với tất cả các phần tử thu thập con

Tôi có một lớp cha với một Tập hợp các thực thể con. Các thực thể con chỉ là một trình bao bọc cho một chuỗi và sống trong một bảng khác với thực thể cha. Tôi muốn có một truy vấn tiêu chí trả về các thực thể cha khi tất cả các thành viên của tập hợp các thực thể con trả về true cho một điều kiện. Điều kiện này phù hợp với một trong một danh sách các chuỗi. Đây là nơi tôi đang ở:

Criteria c = criteria(); 
Criteria ands = c.createCriteria("ands"); 
Disjunction dis = Restrictions.disjunction(); 
for (String value : values) { 
    dis.add(Restrictions.like("value", "%" + value + "%")); 
} 
ands.add(dis); 
return list(c); 

"ands" là tập hợp các thực thể có trường "giá trị" là một chuỗi. "criteria()" tạo tiêu chí cho lớp cha. "list()" chỉ cần gọi criteria.list();

Điều này chỉ khớp với bất kỳ yếu tố nào, thay vì tất cả.

Hy vọng điều này có ý nghĩa. Bất kỳ giúp đỡ nhiều đánh giá cao.

Trả lời

0

Không nên tách rời sự kết hợp đó?

+0

Hi, Nó cần phải là một phân ly bởi vì tôi muốn chọn phụ huynh nơi mọi phần tử trong bộ sưu tập cũng giống như một trong hai chuỗi a, hoặc chuỗi b, hoặc chuỗi c. v.v. –

3

Như một bài tập lý thuyết, bạn có thể làm một cái gì đó như thế này:

Criterion condition = ...; 

Criteria c = s.createCriteria(Parent.class, "p"); 
DetachedCriteria dc = DetachedCriteria.forClass(Parent.class, "p2") 
    .createCriteria("ands", "c") 
    .add(Restrictions.not(condition)) 
    .add(Property.forName("p.id").eqProperty("p2.id")) 
    .setProjection(Projections.id()); 

c.add(Subqueries.notExists(dc)); 

Tuy nhiên, phương pháp này là không tốt cho sử dụng thực tế bởi vì nó đòi hỏi thêm join (do sự vắng mặt của in elements điều khoản trong Tiêu chuẩn API). Cũng lưu ý rằng nó sử dụng phủ định kép (SELECT ... WHERE NOT EXISTS (SELECT ... WHERE NOT <condition>)), do đó, nó có thể có vấn đề với NULL s.

EDIT: Trong HQL nó có thể được viết như thế này:

from Parent p 
where not exists (select c from p.ands c where not <condition>) 

hoặc

from Parent p 
where not exists (select c from Child c 
    where not <condition> and c in elements(p.ands)) 

Nhưng, theo như tôi hiểu, cả hai truy vấn có thể không được diễn tả trong Tiêu chuẩn API (bạn không thể viết from p.ands trong truy vấn phụ và không thể sử dụng in elements). Vì vậy, trong Tiêu chuẩn API bạn phải sử dụng thêm tham gia (lưu ý 2 Parent s):

from Parent p 
where not exists (select c from Parent p2 join p2.ands c 
    where not <condition> and p = p2) 
+0

cảm ơn vì điều này. Chỉ cần khám phá khả năng của nó. Có lẽ HQL sẽ tốt hơn ở đây, nhưng tôi đang gặp khó khăn khi hiểu được mệnh đề elements(). Tôi có thể sử dụng tất cả các yếu tố (parent.ands) bằng cách nào đó có lẽ? –

+0

@Andrew: Đã chỉnh sửa – axtavt

+0

ah - tuyệt. Điều này hoạt động như mong đợi. Cảm ơn rất nhiều. Chỉ quan tâm đến hiệu suất ngay bây giờ. –

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