Ich versuche, ein grundlegendes "ODER" für drei Felder mithilfe einer Abfrage nach Kriterien für den Ruhezustand durchzuführen.
Beispiel
class Whatever{
string name;
string address;
string phoneNumber;
}
Ich möchte eine Kriterienabfrage erstellen, bei der meine Suchzeichenfolge mit "Name" oder "Adresse" oder "Telefonnummer" übereinstimmen kann.
(name = x AND address = y) OR (phoneNumber = z)
?Angenommen, Sie haben eine Sitzung im Ruhezustand zur Hand, dann sollte etwa Folgendes funktionieren:
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);
quelle
//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);
// Dasselbe kann für (c1 ODER c2) UND c3 oder jeden komplexen Ausdruck gemacht werden.
quelle
//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.
quelle
Nur für den Fall, dass jemand mit der gleichen Frage für NHibernate darauf stoßen sollte:
ICriteria c = session.CreateCriteria(typeof (Whatever)) .Add(Expression.Disjunction() .Add(Expression.Eq("name", searchString)) .Add(Expression.Eq("address", searchString)) .Add(Expression.Eq("phoneNumber", searchString)));
quelle
Die Bedingungen können mithilfe von oder / und in verschiedenen Ebenen der Abfrage mithilfe der Disjunktion angewendet werden
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();
quelle
Dies hat für mich bei einer OP-Bedingung funktioniert, auch bei einer IN-Bedingung und nicht bei der Antwort, die bei dieser Diskussion am meisten positiv bewertet wurde:
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"}) ));
Resultierende Abfrage:
and ( this_.XXXX=? or this_.YYYY in ( ?, ?, ? ) )
quelle
Wenn jemand CriteriaQuery anstelle von Criteria verwendet, können Sie alle Ihre Ausdrücke in eine
Predicate
Liste einfügen und ein ODER nach Prädikatgröße wie folgt einfügen :List<Predicate> predicates = new ArrayList<>(); if (...) { predicates.add(...); } criteriaQuery.where(cb.or(predicates.toArray(new Predicate[predicates.size()])));
quelle