web-dev-qa-db-ja.com

CriteriaBuilder.and&CriteriaBuilder.or、ハウツー?

JPA基準を使用するように次のHQLを変更しようとしています。

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

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();

少し簡潔にできるかもしれませんが、HQLは24とCriteriaバージョン28を返します。私は処理していません。

and (x = y OR z = y)

正しく。どんなポインタでも大歓迎です。ありがとう。

14
kmansoor

JPQLクエリのwhere句は次のとおりです。

where d.parent is null 
and (
    d.name like :term 
    or c.name like :term
    ) 

Where句には2つの述語が含まれます。

d.parent is null 

そして

(d.name like :term 
 or c.name like :term)

2番目の述語は、2つの述語を含むorです。

d.name like :term

そして

c.name like :term

したがって、条件クエリで同じ構造が必要です。

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);
36
JB Nizet