2008-09-11 49 views
74

Tôi đang cố gắng thực hiện "OR" cơ bản trên ba trường sử dụng truy vấn tiêu chí ngủ đông.Làm thế nào để bạn "OR" tiêu chí với nhau khi sử dụng một truy vấn tiêu chí với hibernate?

Ví dụ

class Whatever{ 
string name; 
string address; 
string phoneNumber; 
} 

Tôi muốn xây dựng một truy vấn tiêu chí nơi chuỗi tìm kiếm của tôi có thể phù hợp với "tên" hay "địa chỉ" hay "PhoneNumber".

Trả lời

123

Bạn muốn sử dụng Restrictions.disjuntion(). Giống như vậy

session.createCriteria(Whatever.class) 
    .add(Restrictions.disjunction() 
     .add(Restrictions.eq("name", queryString)) 
     .add(Restrictions.eq("address", queryString)) 
     .add(Restrictions.eq("phoneNumber", queryString)) 
    ); 

Xem tài liệu Hibernate here.

+0

Đó là hoàn hảo cảm ơn! Cuối cùng tôi đã tìm thấy một ví dụ trực tuyến, nhưng tôi rất vui vì nó ở đây để tham khảo trong tương lai. – ScArcher2

+3

nếu tôi muốn '(name = x AND address = y) HOẶC (phoneNumber = z)'? –

61

Giả sử bạn có một phiên hibernate để tay sau đó một cái gì đó như sau nên làm việc:

Criteria c = session.createCriteria(Whatever.class); 
Disjunction or = Restrictions.disjunction(); 
or.add(Restrictions.eq("name",searchString)); 
or.add(Restrictions.eq("address",searchString)); 
or.add(Restrictions.eq("phoneNumber",searchString)); 
c.add(or); 
+4

Tôi thích cú pháp tạo Disjunction và đặt tên cho nó hoặc. Nó dễ đọc hơn nhiều so với giải pháp khác. – ScArcher2

+0

Điều này thật tuyệt vời :) Đồng ý với @ ScArcher2, nó rất dễ đọc và làm cho ví dụ phức tạp hơn tôi phải làm dễ hiểu hơn nhiều. –

3

Chỉ trong trường hợp bất cứ ai nên khi vấp ngã này với cùng một câu hỏi cho NHibernate:

ICriteria c = session.CreateCriteria(typeof (Whatever)) 
    .Add(Expression.Disjunction() 
     .Add(Expression.Eq("name", searchString)) 
     .Add(Expression.Eq("address", searchString)) 
     .Add(Expression.Eq("phoneNumber", searchString))); 
8
//Expression : (c1 AND c2) OR (c3)  


    Criteria criteria = session.createCriteria(Employee.class); 

     Criterion c1 = Restrictions.like("name", "%e%"); 
     Criterion c2 = Restrictions.ge("salary", 10000.00); 
     Criterion c3 = Restrictions.like("name", "%YYY%"); 
     Criterion c4 = Restrictions.or(Restrictions.and(c1, c2), c3); 
     criteria.add(c4); 

// Điều tương tự có thể được thực hiện cho (c1 HOẶC c2) VÀ c3, hoặc bất kỳ biểu thức phức tạp nào.

5
//Expression : (c1 AND c2) OR (c3)  


Criteria criteria = session.createCriteria(Employee.class); 

    Criterion c1 = Restrictions.like("name", "%e%"); 
    Criterion c2 = Restrictions.ge("salary", 10000.00); 
    Criterion c3 = Restrictions.like("name", "%YYY%"); 
    Criterion c4 = Restrictions.or(Restrictions.and(c1, c2), c3); 
    criteria.add(c4); 

    //Same thing can be done for (c1 OR c2) AND c3, or any complex expression. 
0

Các điều kiện có thể được áp dụng bằng cách sử dụng hoặc/và ở mức độ khác nhau của truy vấn sử dụng phân ly

Criteria query = getCriteria("ENTITY_NAME"); 
query.add(Restrictions.ne("column Name", current _value)); 

Disjunction disjunction = Restrictions.disjunction(); 

if (param_1 != null) 
    disjunction.add(Restrictions.or(Restrictions.eq("column Name", param1))); 

if (param_2 != null) 
    disjunction.add(Restrictions.or(Restrictions.eq("column Name", param_2))); 

if (param_3 != null) 
    disjunction.add(Restrictions.or(Restrictions.eq("column Name", param_3))); 
if (param_4 != null && param_5 != null) 
    disjunction.add(Restrictions.or(Restrictions.and(Restrictions.eq("column Name", param_4), Restrictions.eq("column Name", param_5)))); 

if (disjunction.conditions() != null && disjunction.conditions().iterator().hasNext()) 
    query.add(Restrictions.and(disjunction)); 

return query.list(); 
+0

là nó có thể có được null cho tất cả các yếu tố không được tìm thấy trong db? – fiddle

+0

Đó là sự thống nhất: một danh sách được trả về với tất cả các kết quả, cho dù có bất kỳ kết quả nào hay không. –

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