Wie verknüpfen Sie Kriterien mit „ODER“, wenn Sie eine Kriterienabfrage mit Ruhezustand verwenden?
Frage
Ich versuche, mithilfe einer Ruhezustandskriterienabfrage ein einfaches „ODER“ für drei Felder durchzuführen.
Beispiel
class Whatever{
string name;
string address;
string phoneNumber;
}
Ich möchte eine Kriterienabfrage erstellen, bei der meine Suchzeichenfolge mit „Name“, „Adresse“ oder „Telefonnummer“ übereinstimmen könnte.
Lösung
Andere Tipps
Angenommen, Sie eine Hibernate-Session zur Hand haben, dann sollte etwa wie folgt 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);
//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);
// Das Gleiche gilt für (C1 oder C2) und C3 oder einer beliebigen komplexen Ausdruck erfolgen.
//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.
Für den Fall, jemand auf diese mit der gleichen Frage für NHibernate stolpern 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)));
können die Bedingungen angewandt werden, mit der oder / und in verschiedenen Ebenen der Abfrage mit disjunction
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();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow