在使用条件查询和休眠时,如何同时使用“ OR”条件?

我正在尝试使用休眠条件查询对三个字段执行基本的“ OR”操作。

例子

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

我想建立一个条件查询,其中我的搜索字符串可以匹配“名称”或“地址”或“电话号码”。

105742 次浏览

你想使用 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 文档 给你

假设你手头有一个冬眠会议,那么下面这样的方法应该可以奏效:

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);

以防有人碰巧对 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)));
    //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 OR c2) AND c3或任何复杂表达式都可以这样做。

//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.

可以使用 or/和在查询的不同级别中应用这些条件 使用析取法

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();

这就是我在 OR 条件下得到的结果,也是在 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 (
?, ?, ?
)
)

如果有人使用 CriteriaQuery 而不是 Criteria,你可以把你所有的表达式放在一个 Predicate列表中,然后按谓词大小放一个 OR,如下所示:

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


criteriaQuery.where(cb.or(predicates.toArray(new Predicate[predicates.size()])));