Як ви разом “АБО” вибираєте критерії при використанні запиту критеріїв із сплячим режимом?


79

Я намагаюся зробити базове "АБО" у трьох полях, використовуючи запит критеріїв сплячого режиму.

Приклад

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

Я хотів би створити запит критеріїв, де мій рядок пошуку міг би відповідати "name", "address" or "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))
    );

Дивіться документ про сплячий режим тут .


Це чудово дякую! Нарешті я знайшов приклад в Інтернеті, але радий, що він тут для подальшого використання.
ScArcher2

8
що якби я хотів (name = x AND address = y) OR (phoneNumber = z)?
Kevin Meredith

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
Мені подобається синтаксис створення диз’юнкції та присвоєння їй імені або. Це набагато читабельніше, ніж інше рішення.
ScArcher2

Це було чудово :) Також погодьтеся з @ ScArcher2, він дуже читабельний і зробив більш складний приклад, який мені довелося зробити набагато простішим для розуміння.
Дастін Йенсен,

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 АБО c2) І 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();

чи можна отримати null для всіх елементів, не знайдених у базі даних?
скрипка

Це послідовно: повертається список із усіма результатами, незалежно від того, є вони чи ні.
Tiago Medici

1

Це те, що мені вдалося для умови АБО, що теж із умовою 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

Якщо хтось використовує CriteriaQuery замість Criteria, ви можете помістити всі свої вирази в Predicateсписок і поставити АБО за розміром предикатів, як це:

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

criteriaQuery.where(cb.or(predicates.toArray(new Predicate[predicates.size()])));
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.