Frage

QueryDSL definiert eine OrderSpecifier Schnittstelle und eine Instanz dafür können für jedes Feld einfach per Aufruf abgerufen werden asc() oder desc().Der QueryDslPredicateExecutor Schnittstelle von Spring Data JPA hat sogar eine findAll() Methode, die dauert OrderSpecifiers als Parameter.

org.springframework.data.domain.PageRequest weiß jedoch nichts über QueryDSL und verfügt über eine eigene Methode zum Definieren der Sortierreihenfolge von Abfragen, nämlich org.springframework.data.domain.Sort.Es kann mehrere enthalten org.springframework.data.domain.Sort.Orders, die sehr ähnlich sind OrderSpecifiers, außer dass sie nicht typsicher sind usw.

Wenn ich also eine ausgelagerte Abfrage erstellen möchte, die Sortierung verwendet, gibt es dann wirklich keine Möglichkeit, QueryDSL zum Definieren zu verwenden?

War es hilfreich?

Lösung

Es sollte so funktionieren, wenn Sie keinen anderen Weg finden

private Sort sortBy(Path<?> path) {
    return new Sort(Sort.Direction.ASC, path.getMetadata().getExpression().toString());
}

Andere Tipps

Ich weiß, es ist schon eine Weile her und ich bin mir nicht sicher, ob dies zum Zeitpunkt des OP verfügbar war, aber jetzt gibt es eines QPageRequest Objekt eingeführt, das das Hinzufügen einer Sortierung über QueryDSL zu Spring Data jpa Query DSL ermöglicht ...

Hier ist eine viel einfachere Möglichkeit, eine zu konstruieren Sort Objekt mit QueryDSL:

new QSort(user.manager.firstname.asc())

Dann können Sie es in einem verwenden PageRequest etwa so:

new PageRequest(0, 10, new QSort(user.manager.firstname.asc()))

Der getExpression() Die Methode wurde entfernt, und ich hatte ähnliche Ausdrücke wie QPost.post.period.periCode welche erforderlich eine Durchquerung, und ohne den vollständigen Namen des Ausdrucks könnte ich nichts dagegen tun, also habe ich jetzt eine Methode erstellt, die sammelt period.periCode und funktioniert einwandfrei QPost.post.

private String resolveOrderPath(Path<?> path) {
    StringBuilder stringBuffer = new StringBuilder(path.getMetadata().getName());
    path = path.getMetadata().getParent();
    while(!path.getMetadata().isRoot()) {
        stringBuffer.insert(0, path.getMetadata().getName() + ".");
        path = path.getMetadata().getParent();
    }
    return stringBuffer.toString();
}

Path<?> path = QPost.post.period.periCode;
String propertyPath = resolveOrderPath(path);
Sort sort = new Sort("asc".equals(sSortDir0) ? Sort.Direction.ASC : Sort.Direction.DESC, propertyPath);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top