Я пытаюсь выполнить простое «ИЛИ» для трех полей, используя запрос критериев гибернации.
пример
class Whatever{
string name;
string address;
string phoneNumber;
}
Я хотел бы создать критерий запроса, в котором моя строка поиска могла бы соответствовать «имени», «адресу» или «номеру телефона».
(name = x AND address = y) OR (phoneNumber = z)
?Предполагая, что у вас есть под рукой сеанс гибернации, должно работать что-то вроде следующего:
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);
источник
//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 или любого сложного выражения.
источник
//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.
источник
На всякий случай кто-нибудь наткнется на это с тем же вопросом для 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)));
источник
Условия могут применяться с помощью или / и на разных уровнях запроса с помощью дизъюнкции.
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();
источник
Это то, что сработало для меня с условием ИЛИ, которое тоже с условием 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 ( ?, ?, ? ) )
источник
Если кто-то использует CriteriaQuery вместо Criteria, вы можете поместить все свои выражения в
Predicate
список и поставить OR по размеру предикатов следующим образом:List<Predicate> predicates = new ArrayList<>(); if (...) { predicates.add(...); } criteriaQuery.where(cb.or(predicates.toArray(new Predicate[predicates.size()])));
источник