tutorialspoint query namedquery example ejemplos create java jpa sql-order-by criteria-api

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