JPA Criteria Query API und Reihenfolge nach zwei Spalten

Lesezeit: 3 Minuten

Benutzer-Avatar
kmansor

Ich stecke mit einem einfachen Problem fest; kämpfen, wie man anruft order by auf einen joined Entität. Im Wesentlichen versuche ich damit folgendes zu erreichen 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

Ich habe folgendes:

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

Wie zu erreichen order by d.name, c.name mit Criteria API? Ich habe es mit Expression, Path versucht, aber es hat nicht funktioniert. Alle Hinweise werden sehr geschätzt.

Wenn Sie ein paar Bestellungen hinzufügen müssen, können Sie so etwas machen (aber für Ihre Abfrage und verschiedene Stammobjekte)

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

Benutzer-Avatar
Saif

Ich habe das gleiche Problem mit der Bestellung über die Criteria API. Ich habe diese Lösung gefunden:

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

Ich hatte Probleme, dasselbe zu tun, und ich habe auf dieser Seite eine Lösung gefunden:
http://www.objectdb.com/api/java/jpa/criteria/CriteriaQuery/orderBy_Order_

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

Geben Sie die Sortierausdrücke an, die zum Sortieren der Abfrageergebnisse verwendet werden. Ersetzt die vorherigen Sortierausdrücke, falls vorhanden. Wenn keine Sortierausdrücke angegeben sind, wird die vorherige Sortierung, falls vorhanden, einfach entfernt, und die Ergebnisse werden in keiner bestimmten Reihenfolge zurückgegeben. Die Reihenfolge der Sortierausdrücke von links nach rechts bestimmt den Vorrang, wobei der ganz linke den höchsten Vorrang hat.

Parameter: o – Null oder mehr Ordnungsausdrücke

Rückgabe: die geänderte Abfrage

Seit: JPA 2.0

  • Wie wird dies als Antwort für den Problemautor beschrieben?

    – Tschüss

    13. Januar 2017 um 7:47 Uhr

  • Warum denkst du nicht? Er wollte wissen, wie man nach mehreren Eigenschaften bestellt. Meine Antwort enthält, wie das geht … Übersehe ich etwas?

    – Adamsan

    13. Januar 2017 um 21:58 Uhr

  • Weil es nicht mit Distinct und Sortieren nach Eigenschaft aus der Join-Tabelle funktioniert

    – Tschüss

    15. Januar 2017 um 3:17 Uhr

Die Lösung, die für mich funktioniert, ist die folgende

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

Hinweis: ejeRoot ist das Klassenobjekt

categoryRepository.findAll(predicates, new Sort(Direction.ASC, "sortOrder", "name"))
.forEach(categoryDtoList::add);

  • Dies kann verwendet werden, um eine Liste basierend auf sortOrder und name zu ordnen, wenn die sortOrder basierend auf dem Namen gleich ist, werden die Elemente sortiert

    – Pradeep

    29. März 2018 um 5:23 Uhr

  • Dies ist nur für Benutzer von Spring Data.

    – Marcel Overdijk

    13. November 2018 um 8:29 Uhr

  • Dies kann verwendet werden, um eine Liste basierend auf sortOrder und name zu ordnen, wenn die sortOrder basierend auf dem Namen gleich ist, werden die Elemente sortiert

    – Pradeep

    29. März 2018 um 5:23 Uhr

  • Dies ist nur für Benutzer von Spring Data.

    – Marcel Overdijk

    13. November 2018 um 8:29 Uhr

1086510cookie-checkJPA Criteria Query API und Reihenfolge nach zwei Spalten

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy