CriteriaBuilder.y & CriteriaBuilder.o, cómo?

Estoy tratando de cambiar la siguiente HQL usar JPA Criterios:

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 tiene un Set<Department> de los niños.

Criterios:

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

Sé que puede ser un poco escueto, sin embargo, el HQL devuelve 24 y Criterios de la versión 28. Creo que no soy el manejo de:

and (x = y OR z = y)

correctamente. Alguna sugerencia será muy apreciada.
Gracias.

OriginalEl autor kmansoor | 2013-08-05

1 Kommentar

  1. 33

    Aquí está la cláusula where de la consulta JPQL:

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

    La cláusula where contiene dos predicados:

    d.parent is null 
    

    y

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

    El segundo predicado es un or que contiene dos predicados:

    d.name like :term
    

    y

    c.name like :term
    

    Por lo que necesita de la misma estructura en sus criterios de consulta:

    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);
    
    Un millón de gracias.
    Gracias por este como yo también estaba buscando esto.

    OriginalEl autor JB Nizet

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea