Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “你怎么看?”;或;在hibernate中使用条件查询时,是否将条件放在一起?_Java_Hibernate - Fatal编程技术网

Java “你怎么看?”;或;在hibernate中使用条件查询时,是否将条件放在一起?

Java “你怎么看?”;或;在hibernate中使用条件查询时,是否将条件放在一起?,java,hibernate,Java,Hibernate,我尝试使用hibernate条件查询对三个字段执行基本的“或” 范例 class Whatever{ string name; string address; string phoneNumber; } 我想建立一个条件查询,其中我的搜索字符串可以匹配“姓名”或“地址”或“电话号码”。您想使用限制。disjuntion()。像这样 session.createCriteria(Whatever.class) .add(Restrictions.disjunction()

我尝试使用hibernate条件查询对三个字段执行基本的“或”

范例

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

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

您想使用
限制。disjuntion()
。像这样

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

请参阅Hibernate文档。

假设您手头有一个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)));

//可以对(c1或c2)和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.
使用析取

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

这就是我对一个或一个条件有效的原因,在一个或一个条件下也是如此,而不是在这次讨论中投票最多的答案:

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而不是CriteriaQuery,您可以将所有表达式放入
谓词
列表中,并按谓词大小放入OR,如下所示:

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

criteriaQuery.where(cb.or(predicates.toArray(new Predicate[predicates.size()])));
List谓词=new ArrayList();
如果(…){
谓词。添加(…);
}
where(cb.or(predicates.toArray(新谓词[predicates.size())));

太好了,谢谢!我终于在网上找到了一个例子,但我很高兴它在这里供将来参考。如果我想要
(name=x和address=y)或(phoneNumber=z)
,我确实喜欢创建析取并将其命名为或的语法。它比其他解决方案更具可读性。这非常好:)也同意@ScArcher2,它非常可读,并且使我必须做的更复杂的示例更容易理解。是否可能为数据库中未找到的所有元素设置null?这是一致的:返回一个包含所有结果的列表,无论是否有结果。
List<Predicate> predicates = new ArrayList<>();
if (...) {
  predicates.add(...);
}

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