How would I achieve this using Hibernate Restrictions?
(((A=\'X\') and (B in(\'X\',Y))) or ((A=\'Y\') and (B=\'Z\')))
For the new Criteria since version Hibernate 5.2:
CriteriaBuilder criteriaBuilder = getSession().getCriteriaBuilder(); CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(SomeClass.class); Root root = criteriaQuery.from(SomeClass.class); Path expressionA = root.get("A"); Path 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 list = getSession() .createQuery(criteriaQuery) .getResultList();