在使用带有hibernate的条件查询时,如何将“OR”标准放在一起?

java hibernate

89160 观看

7回复

64024 作者的声誉

我正在尝试使用hibernate条件查询在三个字段上执行基本的“OR”。

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

我想构建一个条件查询,我的搜索字符串可以匹配“name”或“address”或“phoneNumber”。

作者: ScArcher2 的来源 发布者: 2008 年 9 月 11 日

回应 (7)


126

49914 作者的声誉

决定

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

作者: sblundy 发布者: 11.09.2008 08:23

65

2253 作者的声誉

假设你有一个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);
作者: Rob Oxspring 发布者: 11.09.2008 08:31

3

846 作者的声誉

以防万一有人应该为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)));
作者: Geir-Tore Lindsve 发布者: 12.09.2008 10:40

10

109 作者的声誉

    //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或任何复杂表达式做同样的事情。

作者: Dharmender Rawat 发布者: 13.08.2014 10:37

6

89 作者的声誉

//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.
作者: DharmenderRawat 发布者: 13.08.2014 07:09

1

305 作者的声誉

可以使用析取来使用或者在查询的不同级别应用条件

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();
作者: Tiago Medici 发布者: 08.04.2016 07:45

0

7 作者的声誉

对于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"})
                    ));
作者: ONS 发布者: 21.06.2019 06:46
32x32