Wie verknüpfen Sie Kriterien mit „ODER“, wenn Sie eine Kriterienabfrage mit Ruhezustand verwenden?

StackOverflow https://stackoverflow.com/questions/57484

  •  09-06-2019
  •  | 
  •  

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.

War es hilfreich?

Lösung

Sie möchten Restrictions.disjuntion() verwenden. Wie so

session.createCriteria(Whatever.class)
    .add(Restrictions.disjunction()
        .add(Restrictions.eq("name", queryString))
        .add(Restrictions.eq("address", queryString))
        .add(Restrictions.eq("phoneNumber", queryString))
    );

Sehen Sie die Hibernate doc .

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
scroll top