休眠条件在多个位置进行AND或运算

Lyn*_*nAs 3 java hibernate

我正在尝试使用休眠条件进行以下查询

SELECT * FROM EUser
WHERE 
userName LIKE '%mat%' OR
firstName LIKE '%mat%' OR
lastName LIKE '%mat%' OR
middleName LIKE '%mat%' AND 
enable = 'ACTIVE';
Run Code Online (Sandbox Code Playgroud)

现在我可以使用如下查询(//通过谷歌搜索找到)

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();
Run Code Online (Sandbox Code Playgroud)

但是对于这么少的查询似乎编码太多

有没有更简单的代码可以实现这一目标?

Nim*_*sky 5

这是您的实际查询,更加简洁。

   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();
Run Code Online (Sandbox Code Playgroud)

有点罗word,但确实会使您的代码保持良好状态,并且易于执行动态和通用查询。


Fre*_*Goo 5

对于 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();
Run Code Online (Sandbox Code Playgroud)