简体   繁体   中英

Hibernate Criteria AND OR operation on multiple where

I am trying to do the following query using Hibernate Criteria

SELECT * FROM EUser
WHERE 
userName LIKE '%mat%' OR
firstName LIKE '%mat%' OR
lastName LIKE '%mat%' OR
middleName LIKE '%mat%' AND 
enable = 'ACTIVE';

Now I can Use query like following (//found by googling)

Criteria criteria = session.createCriteria(EUser.class);
        Criterion roll = Restrictions.eq("rollNo", 2);
        Criterion name = Restrictions.eq("name", "John");
        LogicalExpression expression = Restrictions.or(roll, name);
        criteria.add(expression);
        List list = criteria.list();

Criteria criteria = session.createCriteria(EUser.class);
        Criterion roll = Restrictions.eq("rollNo", 1);
        Criterion name = Restrictions.eq("name", "John");
        LogicalExpression expression = Restrictions.and(roll, name);
        criteria.add(expression);
        List list = criteria.list();

But it seems too much coding for so little query

Is there any simpler code to achieve this??

This is your actual query, slightly more succint.

   session.createCriteria(EUser.class)
   .add(Restrictions.disjunction()
      .add(Restrictions.like("userName", "mat%"))
      .add(Restrictions.like("firstName", "mat%")) 
      .add(Restrictions.like("lastName", "mat%")) 
      .add(Restrictions.like("middleName", "mat%")))
   .add(Restrictions.eq("enable ", "active"))
   .list();

Rather wordy, but does keep your code nice an oop and easy to do dynamic and generic queries.

For the new Criteria since version Hibernate 5.2:

CriteriaBuilder criteriaBuilder = getSession().getCriteriaBuilder();
CriteriaQuery<EUser> criteriaQuery = criteriaBuilder.createQuery(EUser.class);

Root<EUser> root = getRoot(criteriaQuery);
Path<String> userName = root.get("userName");
Path<String> firstName = root.get("firstName");
Path<String> lastName = root.get("lastName");
Path<String> middleName = root.get("middleName");
Path<String> enable = root.get("enable");

Predicate userNamePredicate = criteriaBuilder.like(userName, "%mat%");
Predicate firstNamePredicate = criteriaBuilder.like(firstName, "%mat%");
Predicate lastNamePredicate = criteriaBuilder.like(lastName, "%mat%");
Predicate middleNamePredicate = criteriaBuilder.like(middleName, "%mat%");
Predicate enablePredicate = criteriaBuilder.equal(enable, "ACTIVE");

Predicate middleNameAndEnablePredicate = criteriaBuilder.and(middleNamePredicate, enablePredicate);
Predicate predicate = criteriaBuilder.or(userNamePredicate, firstNamePredicate, lastNamePredicate, middleNameAndEnablePredicate);

criteriaQuery
    .select(root)
    .where(predicate);

List<EUser> list = getSession()
        .createQuery(criteriaQuery)
        .getResultList();

Maybe This can help someone

@PostMapping("/partiesAllBySpecification")
public List<Party> getAllPartysByCriteria(@RequestBody Party party) {
    return partyRepository.findAll(new Specification<Party>() {
        @Override

        public Predicate toPredicate(Root<Party> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
            List<Predicate> predicates1 = new ArrayList<>();
            predicates1.add(criteriaBuilder.and(criteriaBuilder.equal(root.get("is_active"), true)));
            predicates1
                    .add(criteriaBuilder.and(criteriaBuilder.equal(root.get("branch_id"), party.getBranch_id())));
            List<Predicate> predicates2 = new ArrayList<>();
            int challan_type = party.getChallan_type();
            if (challan_type == 0 || challan_type == 2 || challan_type == 4 || challan_type == 6) {// Customer
                predicates2.add(criteriaBuilder.or(criteriaBuilder.equal(root.get("party_type"), 1)));
                predicates2.add(criteriaBuilder.or(criteriaBuilder.equal(root.get("party_type"), 5)));
                predicates2.add(criteriaBuilder.or(criteriaBuilder.equal(root.get("party_type"), 6)));
                predicates2.add(criteriaBuilder.or(criteriaBuilder.equal(root.get("party_type"), 7)));
                predicates2.add(criteriaBuilder.or(criteriaBuilder.equal(root.get("party_type"), 8)));
                predicates2.add(criteriaBuilder.or(criteriaBuilder.equal(root.get("party_type"), 9)));
                predicates2.add(criteriaBuilder.or(criteriaBuilder.equal(root.get("party_type"), 10)));
                predicates2.add(criteriaBuilder.or(criteriaBuilder.equal(root.get("party_type"), 11)));
            } else if (challan_type == 1 || challan_type == 3 || challan_type == 5 || challan_type == 7
                    || challan_type == 8) {// Inward - Dealer
                predicates2.add(criteriaBuilder.or(criteriaBuilder.equal(root.get("party_type"), 2)));
                predicates2.add(criteriaBuilder.or(criteriaBuilder.equal(root.get("party_type"), 5)));
                predicates2.add(criteriaBuilder.or(criteriaBuilder.equal(root.get("party_type"), 8)));
                predicates2.add(criteriaBuilder.or(criteriaBuilder.equal(root.get("party_type"), 9)));
                predicates2.add(criteriaBuilder.or(criteriaBuilder.equal(root.get("party_type"), 11)));
                predicates2.add(criteriaBuilder.or(criteriaBuilder.equal(root.get("party_type"), 12)));
                predicates2.add(criteriaBuilder.or(criteriaBuilder.equal(root.get("party_type"), 13)));
                predicates2.add(criteriaBuilder.or(criteriaBuilder.equal(root.get("party_type"), 14)));
            } else if (challan_type == 10) {// Raw Metal Inward : Contractor
                predicates2.add(criteriaBuilder.or(criteriaBuilder.equal(root.get("party_type"), 4)));
                predicates2.add(criteriaBuilder.or(criteriaBuilder.equal(root.get("party_type"), 7)));
                predicates2.add(criteriaBuilder.or(criteriaBuilder.equal(root.get("party_type"), 9)));
                predicates2.add(criteriaBuilder.or(criteriaBuilder.equal(root.get("party_type"), 10)));
                predicates2.add(criteriaBuilder.or(criteriaBuilder.equal(root.get("party_type"), 11)));
                predicates2.add(criteriaBuilder.or(criteriaBuilder.equal(root.get("party_type"), 13)));
                predicates2.add(criteriaBuilder.or(criteriaBuilder.equal(root.get("party_type"), 14)));
                predicates2.add(criteriaBuilder.or(criteriaBuilder.equal(root.get("party_type"), 15)));
            }
            List<Predicate> predicates = new ArrayList<>();
            predicates.add(criteriaBuilder.and(predicates1.toArray(new Predicate[predicates1.size()])));
            predicates.add(criteriaBuilder.or(predicates2.toArray(new Predicate[predicates2.size()])));
            return (criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()])));
        }
    });
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM