79

休止状態の条件クエリを使用して、3 つのフィールドで基本的な「OR」を実行しようとしています。

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

検索文字列が「名前」、「住所」、または「電話番号」に一致する条件クエリを作成したいと考えています。

4

8 に答える 8

137

使用したいRestrictions.disjuntion()。そのようです

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

こちらのHibernateドキュメントを参照してください。

于 2008-09-11T20:23:55.940 に答える
72

手元に休止状態のセッションがあると仮定すると、次のようなものが機能するはずです。

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);
于 2008-09-11T20:31:08.310 に答える
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.
于 2014-08-13T19:09:41.453 に答える
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)));
于 2008-09-12T10:40:47.877 に答える
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();
于 2016-04-08T07:45:09.863 に答える
1

誰かが Criteria の代わりに CriteriaQuery を使用している場合、すべての式をPredicateリストに入れ、次のように述語サイズで OR を入れることができます。

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

criteriaQuery.where(cb.or(predicates.toArray(new Predicate[predicates.size()])));
于 2020-07-30T22:00:03.327 に答える