CriteriaBuilder.and&CriteriaBuilder.or,操作方法?

kma*_*oor 13 criteria-api jpa-2.0

我正在尝试更改以下HQL以使用JPA Criteria:

select distinct d from Department d 
left join fetch d.children c 
where d.parent is null 
and (
    d.name like :term 
    or c.name like :term
    ) 
order by d.name
Run Code Online (Sandbox Code Playgroud)

Department有一个Set<Department>孩子.

标准:

CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
CriteriaQuery<Department> c = cb.createQuery(Department.class);
Root<Department> root = c.from(Department.class);
root.fetch("children", JoinType.LEFT);
Path<Department> children = root.join("children", JoinType.LEFT);
c.orderBy(cb.asc(root.get("name")));
c.distinct(true);
c.where(cb.isNull(root.get("parent")));
String param = "%" + "term" + "%";
cb.and(cb.like(root.<String> get("name"), param));
cb.or(cb.like(children.<String> get("name"), param));

TypedQuery<Department> tq = getEntityManager().createQuery(c);
departments = tq.getResultList();
Run Code Online (Sandbox Code Playgroud)

我知道它可能有点简洁,但是,HQL返回24和Criteria版本28.我想我不处理:

and (x = y OR z = y)
Run Code Online (Sandbox Code Playgroud)

正确.任何指针将不胜感激.谢谢.

JB *_*zet 37

这是JPQL查询的where子句:

where d.parent is null 
and (
    d.name like :term 
    or c.name like :term
    ) 
Run Code Online (Sandbox Code Playgroud)

where子句包含两个谓词:

d.parent is null 
Run Code Online (Sandbox Code Playgroud)

(d.name like :term 
 or c.name like :term)
Run Code Online (Sandbox Code Playgroud)

第二个谓词or包含两个谓词:

d.name like :term
Run Code Online (Sandbox Code Playgroud)

c.name like :term
Run Code Online (Sandbox Code Playgroud)

因此,您需要在条件查询中使用相同的结构:

Predicate orClause = 
    cb.or(cb.like(root.<String>get("name"), param),
          cb.like(children.<String>get("name"), param));

c.where(cb.isNull(root.get("parent")),
        orClause);
Run Code Online (Sandbox Code Playgroud)