Je suis coincé avec un problème simple; du mal à invoquer order by
sur une entité join
ed. 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.
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);
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
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")));
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