최대 절전 모드에서 조건 쿼리를 사용할 때 조건을 어떻게 "OR"합니까?


79

최대 절전 조건 쿼리를 사용하여 세 필드에서 기본 "OR"을 수행하려고합니다.

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

검색 문자열이 "이름", "주소"또는 "전화 번호"와 일치 할 수있는 기준 쿼리를 작성하고 싶습니다.

답변:


133

당신은 사용할 Restrictions.disjuntion(). 그렇게

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

여기 에서 Hibernate 문서를 참조 하십시오 .


정말 감사합니다! 마침내 온라인에서 예제를 찾았지만 나중에 참조 할 수있게되어 기쁩니다.
ScArcher2

8
내가 원하면 (name = x AND address = y) OR (phoneNumber = z)?
케빈 메러디스

71

최대 절전 세션이 있다고 가정하면 다음과 같은 것이 작동합니다.

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
나는 Disjunction을 만들고 명명하는 구문을 좋아합니다. 다른 솔루션보다 훨씬 더 읽기 쉽습니다.
ScArcher2

이것은 대단했습니다 :) 또한 @ ScArcher2에 동의합니다. 매우 읽기 쉽고 더 복잡한 예제를 이해하기 훨씬 쉽게 만들었습니다.
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);

// (c1 OR c2) AND c3 또는 복잡한 표현식에 대해 동일한 작업을 수행 할 수 있습니다.


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

누군가 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

조건은 또는 /를 사용하여 적용 할 수 있으며 분리를 사용하는 쿼리의 여러 수준에서 적용 할 수 있습니다.

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

db에없는 모든 요소에 대해 null을 얻을 수 있습니까?
바이올린

일관성 : 모든 결과가 있는지 여부에 관계없이 목록이 반환됩니다.
Tiago Medici

1

이것은 OR 조건에 대해 나를 위해 일한 것입니다.이 토론에서 가장 많이 투표 한 답변이 아닌 IN 조건에서도 마찬가지입니다.

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"})
                    ));

결과 쿼리 :

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

1

누군가 Criteria 대신 CriteriaQuery를 사용하는 경우 모든 표현식을 Predicate목록에 넣고 다음과 같이 술어 크기별로 OR를 넣을 수 있습니다.

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

criteriaQuery.where(cb.or(predicates.toArray(new Predicate[predicates.size()])));
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.