Wie führe ich eine ausgelagerte QueryDSL-Abfrage mit Spring JPA durch?
-
12-12-2019 - |
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 OrderSpecifier
s 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.Order
s, die sehr ähnlich sind OrderSpecifier
s, 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?
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);