Как использовать оператор ИЛИ в спящем запросе - PullRequest
5 голосов
/ 26 ноября 2010

У меня есть требование использовать оператор И / ИЛИ для спящих запросов с отдельными критериями. Я хочу эмулировать SQL-эквивалент:

Select * from myTable where city in ( X, Y ) OR city in (A,B);  

// Обратите внимание, мне нужно использовать несколько 'In' здесь

Как создать запрос citeria для использования оператора «ИЛИ».

Что-то вроде

DetachedCriteria criteria = DetachedCriteria.forClass(
    myClass.class)
   .add(Property.forName("city").in(X,Y));
criteria.**Or**(add(Property.forName("city").in(X,Y));

К сожалению, в критериях нет метода ИЛИ, только добавьте туда.

Заранее спасибо

Ответы [ 2 ]

10 голосов
/ 26 ноября 2010

Используйте Restrictions.conjunction() и Restrictions.disjunction() для создания иерархии условий.

Смотрите здесь - раздел 15,2 и здесь


РЕДАКТИРОВАТЬ:

Я полагаю, что ваш код Property.forName("city").in(X,Y)) является правильным (я не помню этот пункт)

DetachedCriteria criteria = DetachedCriteria.forClass(
    myClass.class)
   .add(Restrictions.disjunction()
       .add( Property.forName("city").in(X,Y) )
       .add(Property.forName("city").in(X,Y)  )
   );
3 голосов
/ 17 августа 2016

Выполните следующие шаги:

Шаг-1.0: Создание критериев запроса

Criteria myQueryCrit = session.createCriteria(XYZ.class, "xyz");

Шаг-2.0: Для обработки ИЛИ условий запроса:

2.1) Сначалавам нужно создать объект Disjunction, скажем, myQueryDisjunc.

Disjunction myQueryDisjunc = Restrictions.disjunction();

2.2) Затем создайте объекты All OR Criterion.Например:

Criterion xyzName = Restrictions.ilike("xyz.name", "%"+searchStr1+"%", MatchMode.ANYWHERE);

Criterion xyzSpeciality = Restrictions.ilike("xyz.specs", "%"+searchStr1+"%", MatchMode.ANYWHERE);

Criterion xyzServices = Restrictions.ilike("xyz.services", "%"+searchStr1+"%", MatchMode.ANYWHERE);

2.3) Добавление всех объектов ИЛИ-Критериев в myQueryDisjunc

myQueryDisjunc.add(xyzName);

myQueryDisjunc.add(xyzSpeciality);

myQueryDisjunc.add(xyzServices);

Шаг-3.0: Для обработки И условий запроса:

3.1) Сначала вынеобходимо создать объект Conjunction, скажем, myQueryConjunc.

Conjunction myQueryConjunc = Restrictions.conjunction();

3.2) Затем создать объекты All AND Criterion.Например:

Criterion xyzLoc = Restrictions.ilike("xyz.locStr", "%"+searchStr2+"%", MatchMode.ANYWHERE);

Criterion xyzZip = Restrictions.ilike("xyz.zipStr", "%"+searchStr3+"%", MatchMode.ANYWHERE);

3.3) Добавление всех объектов AND Criterions в myQueryConjunc

myQueryConjunc.add(xyzLoc);

myQueryConjunc.add(xyzZip);

Step-4.0: Теперь добавьте myQueryDisjunc, myQueryConjunc в myQueryCrit:

myQueryCrit.add(myQueryDisjunc);
myQueryCrit.add(myQueryConjunc);

Шаг-5.0: Теперь добавьте любой результат Trnasformer, если необходимо [необязательно]:

myQueryCrit.setResultTransformer(
CriteriaSpecification.DISTINCT_ROOT_ENTITY);

Шаг-6.0: Выполните myQueryCrit, вызвав для него list ().

List <myObj> allResults = myQueryCrit.list();

Шаг-7.0: вот и все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...