Hibernate Criteria Restrictions AND / OR combination

前端 未结 2 1849
Happy的楠姐
Happy的楠姐 2020-11-30 19:50

How would I achieve this using Hibernate Restrictions?

(((A=\'X\') and (B in(\'X\',Y))) or ((A=\'Y\') and (B=\'Z\')))
相关标签:
2条回答
  • 2020-11-30 20:08

    think works

    Criteria criteria = getSession().createCriteria(clazz); 
    Criterion rest1= Restrictions.and(Restrictions.eq(A, "X"), 
               Restrictions.in("B", Arrays.asList("X",Y)));
    Criterion rest2= Restrictions.and(Restrictions.eq(A, "Y"), 
               Restrictions.eq(B, "Z"));
    criteria.add(Restrictions.or(rest1, rest2));
    
    0 讨论(0)
  • 2020-11-30 20:19

    For the new Criteria since version Hibernate 5.2:

    CriteriaBuilder criteriaBuilder = getSession().getCriteriaBuilder();
    CriteriaQuery<SomeClass> criteriaQuery = criteriaBuilder.createQuery(SomeClass.class);
    
    Root<SomeClass> root = criteriaQuery.from(SomeClass.class);
    
    Path<Object> expressionA = root.get("A");
    Path<Object> expressionB = root.get("B");
    
    Predicate predicateAEqualX = criteriaBuilder.equal(expressionA, "X");
    Predicate predicateBInXY = expressionB.in("X",Y);
    Predicate predicateLeft = criteriaBuilder.and(predicateAEqualX, predicateBInXY);
    
    Predicate predicateAEqualY = criteriaBuilder.equal(expressionA, Y);
    Predicate predicateBEqualZ = criteriaBuilder.equal(expressionB, "Z");
    Predicate predicateRight = criteriaBuilder.and(predicateAEqualY, predicateBEqualZ);
    
    Predicate predicateResult = criteriaBuilder.or(predicateLeft, predicateRight);
    
    criteriaQuery
            .select(root)
            .where(predicateResult);
    
    List<SomeClass> list = getSession()
            .createQuery(criteriaQuery)
            .getResultList();  
    
    0 讨论(0)
提交回复
热议问题