Как вы «ИЛИ» критерии вместе при использовании запроса критериев с Hibernate? - PullRequest
75 голосов
/ 12 сентября 2008

Я пытаюсь выполнить базовое «ИЛИ» для трех полей, используя запрос критерия гибернации.

Пример

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

Я бы хотел создать запрос критерия, в котором моя строка поиска могла бы соответствовать "name" или "address" или "phoneNumber".

Ответы [ 6 ]

126 голосов
/ 12 сентября 2008

Вы хотите использовать 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 здесь .

65 голосов
/ 12 сентября 2008

Если у вас есть сеанс гибернации, то должно работать что-то вроде следующего:

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);
10 голосов
/ 13 августа 2014
    //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 ИЛИ c2) И c3 или любого сложного выражения.

6 голосов
/ 13 августа 2014
//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 голосов
/ 12 сентября 2008

На всякий случай, если кто-нибудь наткнется на это с тем же вопросом для 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 голос
/ 08 апреля 2016

Условия могут применяться с использованием или / и на разных уровнях запроса. используя дизъюнкцию

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...