Come eseguire una query di querydsl spostata con JPA di primavera?
-
12-12-2019 - |
Domanda
QueryDSL definisce un'interfaccia OrderSpecifier
e un'istanza per questo può essere facilmente ottenuta per qualsiasi campo chiamando asc()
o desc()
.L'interfaccia QueryDslPredicateExecutor
di DATA GENERALE JPA ha anche un metodo findAll()
che richiede OrderSpecifier
s come parametri.
org.springframework.data.domain.PageRequest
Tuttavia non sa nulla di QueryDSL e ha il suo modo per definire l'ordinamento della query, vale a dire org.springframework.data.domain.Sort
.Può contenere un numero di generatori org.springframework.data.domain.Sort.Order
s che sono molto simili a OrderSpecifier
s, tranne che non sono tipo sicuro ecc.
Allora, se voglio rendere la query dei pagamenti che utilizza l'ordinamento, non c'è davvero un modo di usare querydsl per definire questo?
Soluzione
Dovrebbe funzionare in questo modo se non riesci a trovare un altro modo
private Sort sortBy(Path<?> path) {
return new Sort(Sort.Direction.ASC, path.getMetadata().getExpression().toString());
}
. Altri suggerimenti
So che è passato un po 'di tempo e non sono sicuro che sia stato disponibile al momento dell'OP ma ora c'è un Qpagerequest Object introdotto che consente di ordinare tramite queryddl da aggiungere a DSL DSL di DSL ... .
Ecco un modo molto più semplice per costruire un oggetto Sort
usando querydsl:
new QSort(user.manager.firstname.asc())
.
Quindi puoi usarlo in un PageRequest
come così:
new PageRequest(0, 10, new QSort(user.manager.firstname.asc()))
. Il metodo getExpression()
è stato rimosso, e ho avuto espressioni simili a QPost.post.period.periCode
che avevano bisogno una traversata, e senza il nome completo di espressione non potevo fare nulla a riguardo, quindi ora ho fatto unMetodo che raccoglie period.periCode
e funziona perfettamente su 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);