【问题标题】:How do you "OR" criteria together when using a criteria query with hibernate?在使用带有休眠状态的条件查询时,如何将条件“或”在一起?
【发布时间】:2010-09-08 14:52:56
【问题描述】:

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

例子

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

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

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    您想使用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 文档 here

    【讨论】:

    • 非常感谢!我终于在网上找到了一个例子,但我很高兴它在这里供将来参考。
    • 如果我想要(name = x AND address = y) OR (phoneNumber = z)怎么办?
    【解决方案2】:

    假设您有一个休眠会话要处理,那么类似以下的方法应该可以工作:

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

    【讨论】:

    • 我确实喜欢创建 Disjunction 并将其命名为 or 的语法。它比其他解决方案更具可读性。
    • 这太棒了 :) 也同意@ScArcher2,它非常易读,让我必须做的更复杂的例子更容易理解。
    【解决方案3】:
        //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 或任何复杂的表达式都可以做同样的事情。

    【讨论】:

      【解决方案4】:
      //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.
      

      【讨论】:

        【解决方案5】:

        以防万一有人偶然发现与 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)));
        

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

          • 是否可以为数据库中未找到的所有元素获取 null?
          • 一致:返回一个列表,包含所有结果,不管有没有。
          【解决方案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"})
                              ));
          

          查询结果:

            and (
                      this_.XXXX=? 
                      or this_.YYYY in (
                          ?, ?, ?
                      )
                  ) 
          

          【讨论】:

            【解决方案8】:

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

            List<Predicate> predicates = new ArrayList<>();
            if (...) {
              predicates.add(...);
            }
            
            criteriaQuery.where(cb.or(predicates.toArray(new Predicate[predicates.size()])));
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-03-17
              • 2011-02-23
              • 1970-01-01
              • 2011-06-08
              相关资源
              最近更新 更多