web-dev-qa-db-fra.com

API de requête de critères JPA et ordre par deux colonnes

Je suis coincé avec un problème simple; du mal à invoquer order by sur une entité joined. Essentiellement, j'essaie d'atteindre les objectifs suivants avec 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

J'ai les éléments suivants:

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

Comment atteindre order by d.name, c.name avec Criteria API? J'ai essayé avec Expression, Path mais je n'ai pas fonctionné. Tous les pointeurs seront grandement appréciés.

39
kmansoor

Si vous devez ajouter quelques commandes, vous pouvez créer quelque chose comme (mais pour votre requête et différents objets racine)

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

J'avais du mal à faire de même, et j'ai trouvé une solution sur cette page: http://www.objectdb.com/api/Java/jpa/criteria/CriteriaQuery/orderBy_Order_

//javax.persistence.criteria.CriteriaQuery
//CriteriaQuery<T> orderBy(Order... o)

Spécifiez les expressions de classement utilisées pour classer les résultats de la requête. Remplace les expressions de classement précédentes, le cas échéant. Si aucune expression de commande n'est spécifiée, la commande précédente, le cas échéant, est simplement supprimée et les résultats seront renvoyés dans aucun ordre particulier. La séquence de gauche à droite des expressions de classement détermine la priorité, la plus à gauche ayant la priorité la plus élevée.

Paramètres: o - zéro ou plusieurs expressions de classement

Renvoie: la requête modifiée

Depuis: JPA 2.0

8
Adamsan

J'ai le même problème avec la commande en utilisant l'API Criteria. J'ai trouvé cette solution:

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")));
8
Saif

La solution qui fonctionne pour moi est la suivante

session=HibernateUtil.getSessionJavaConfigFactory_report().openSession();
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Object[]> criteriaQuery = builder.createQuery(Object[].class);
List<Order> orderList = new ArrayList();
orderList.add(builder.desc(ejeRoot.get("name")));
criteriaQuery.orderBy(orderList);

Remarque: ejeRoot est l'objet de classe

0
Jorge Santos Neill