java - namedquery - jpql query
Criterios de JPA Query API y orden por dos columnas (4)
Estoy atascado con un problema simple; luchando por invocar el order by
en una entidad join
ed. Básicamente, estoy tratando de lograr lo siguiente con los JPA Criteria
:
select distinct d from Department d
left join fetch d.children c
left join fetch c.appointments a
where d.parent is null
order by d.name, c.name
Tengo lo siguiente:
CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
CriteriaQuery<Department> c = cb.createQuery(Department.class);
Root<Department> root = c.from(Department.class);
Fetch<Department, Department> childrenFetch = root.fetch(
Department_.children, JoinType.LEFT);
childrenFetch.fetch(Department_.appointments, JoinType.LEFT);
c.orderBy(cb.asc(root.get(Department_.name)));
c.distinct(true);
c.select(root);
c.where(cb.isNull(root.get(Department_.parent)));
¿Cómo lograr el order by d.name, c.name
con Criteria API
? Intenté con Expression, Path pero no funcionó. Cualquier puntero será muy apreciado.
Si necesita agregar un par de órdenes, puede hacer algo como (pero para su consulta y diferentes objetos raíz)
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Route> query = criteriaBuilder.createQuery(Route.class);
Root<Route> routeRoot = query.from(Route.class);
query.select(routeRoot);
List<Order> orderList = new ArrayList();
query.where(routeRoot.get("owner").in(user));
orderList.add(criteriaBuilder.desc(routeRoot.get("date")));
orderList.add(criteriaBuilder.desc(routeRoot.get("rating")));
query.orderBy(orderList);
Tenía problemas para hacer lo mismo y encontré una solución en esta página: http://www.objectdb.com/api/java/jpa/criteria/CriteriaQuery/orderBy_Order_
//javax.persistence.criteria.CriteriaQuery
//CriteriaQuery<T> orderBy(Order... o)
Especifique las expresiones de ordenamiento que se utilizan para ordenar los resultados de la consulta. Reemplaza las expresiones de pedido anteriores, si las hay. Si no se especifican las expresiones de pedido, el orden anterior, si lo hay, se elimina simplemente y los resultados se devolverán sin un orden en particular. La secuencia de izquierda a derecha de las expresiones ordenadas determina la precedencia, por lo que la izquierda tiene la precedencia más alta.
Parámetros: o - cero o más expresiones ordenadas
Devoluciones: la consulta modificada
Desde: JPA 2.0
Tengo el mismo problema con el pedido al usar Criteria API. Encontré esta solución:
CriteriaQuery<Test> q = cb.createQuery(Test.class);
Root<Test> c = q.from(Test.class);
q.select(c);
q.orderBy(cb.asc(c.get("name")), cb.desc(c.get("prenom")));
categoryRepository.findAll(predicates, new Sort(Direction.ASC, "sortOrder", "name")) .forEach(categoryDtoList::add);