How do you “OR” criteria together when using a criteria query with hibernate?

前端 未结 8 892
终归单人心
终归单人心 2020-12-04 07:44

I\'m trying to do a basic \"OR\" on three fields using a hibernate criteria query.

Example

class Whatever{
 string name;
 string address;
 string pho         


        
相关标签:
8条回答
  • 2020-12-04 08:13
        //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.

    0 讨论(0)
  • 2020-12-04 08:14

    The conditions can be applied using the or / and in different levels of the query using disjunction

    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();
    
    0 讨论(0)
  • 2020-12-04 08:26

    You want to use Restrictions.disjuntion(). Like so

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

    See the Hibernate doc here.

    0 讨论(0)
  • 2020-12-04 08:27

    This is what worked for me for an OR condition, that too with an IN condition and not the answer up-voted most on this discussion:

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

    Resulting Query:

      and (
                this_.XXXX=? 
                or this_.YYYY in (
                    ?, ?, ?
                )
            ) 
    
    0 讨论(0)
  • 2020-12-04 08:31

    Just in case anyone should stumble upon this with the same question for 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)));
    
    0 讨论(0)
  • 2020-12-04 08:35

    Assuming you have a hibernate session to hand then something like the following should work:

    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);
    
    0 讨论(0)
提交回复
热议问题