Làm cách nào để bạn kết hợp các tiêu chí "HOẶC" khi sử dụng truy vấn tiêu chí với chế độ ngủ đông?


79

Tôi đang cố gắng thực hiện một "HOẶC" cơ bản trên ba trường bằng cách sử dụng truy vấn tiêu chí ngủ đông.

Thí dụ

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

Tôi muốn tạo một truy vấn tiêu chí trong đó chuỗi tìm kiếm của tôi có thể khớp với "tên" hoặc "địa chỉ" hoặc "phoneNumber".

Câu trả lời:


133

Bạn muốn sử dụng Restrictions.disjuntion(). 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 tại đây .


Đó là lời cảm ơn hoàn hảo! 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

8
nếu tôi muốn (name = x AND address = y) OR (phoneNumber = z)thì sao?
Kevin Meredith,

71

Giả sử bạn có một phiên ngủ đông để xử lý thì những thứ như sau sẽ hoạt động:

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 rất nhiều so với giải pháp khác.
ScArcher2 11/09/08

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

12
    //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 đối với (c1 OR c2) AND c3 hoặc bất kỳ biểu thức phức tạp nào.


6
//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.

3

Đề phòng bất kỳ ai tình cờ gặp điều này với cùng 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)));

1

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

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

là nó có thể nhận được null cho tất cả các phần tử không được tìm thấy trong db?
fiddle

Nó nhất quán: một danh sách được trả về với tất cả các kết quả, cho dù có hay không.
Tiago Medici

1

Đây là điều phù hợp với tôi đối với điều kiện HOẶC, điều đó cũng xảy ra với điều kiện IN và không phải là câu trả lời được bình chọn nhiều nhất trong cuộc thảo luận này:

criteria.add( Restrictions.or(
                    Restrictions.eq(ch.getPath(ch.propertyResolver().getXXXX()), "OR_STRING"),
                        Restrictions.in(ch.getPath(ch.propertyResolver().getYYYY()), new String[]{"AA","BB","CC"})
                    ));

Truy vấn kết quả:

  and (
            this_.XXXX=? 
            or this_.YYYY in (
                ?, ?, ?
            )
        ) 

1

Nếu ai đó đang sử dụng CriteriaQuery thay vì Criteria, bạn có thể đặt tất cả các biểu thức của mình trong một Predicatedanh sách và đặt kích thước vị từ OR theo kích thước như sau:

List<Predicate> predicates = new ArrayList<>();
if (...) {
  predicates.add(...);
}

criteriaQuery.where(cb.or(predicates.toArray(new Predicate[predicates.size()])));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.