كيفية القيام استعلام كيريدسل مقسم إلى صفحات مع الربيع جبا?
-
12-12-2019 - |
سؤال
كيريدسل يعرف OrderSpecifier
واجهة ومثيل لذلك يمكن الحصول عليها بسهولة لأي حقل عن طريق الاتصال asc()
أو desc()
.ال QueryDslPredicateExecutor
واجهة الربيع البيانات جبا حتى لديه findAll()
الطريقة التي تأخذ OrderSpecifier
ق كمعلمات.
org.springframework.data.domain.PageRequest
ومع ذلك لا يعرف أي شيء عن كيريدل ولها طريقتها الخاصة لتحديد ترتيب الاستعلام ، وهي org.springframework.data.domain.Sort
.يمكن أن تحتوي على عدد من org.springframework.data.domain.Sort.Order
الصورة التي هي الكثير مثل OrderSpecifier
س, إلا أنها ليست آمنة من النوع وما إلى ذلك.
لذلك ، إذا كنت تريد أن تجعل الاستعلام مقسم إلى صفحات الذي يستخدم الفرز ، هل هناك حقا أي وسيلة لاستخدام كيريدل لتحديد ذلك?
المحلول
يجب أن تعمل على هذا النحو إذا لم تتمكن من العثور على طريقة أخرى
private Sort sortBy(Path<?> path) {
return new Sort(Sort.Direction.ASC, path.getMetadata().getExpression().toString());
}
نصائح أخرى
وأنا أعلم أنه كان بعض الوقت وأنا لست متأكدا من أن هذا كان متاحا في وقت البروتوكول الاختياري ولكن هناك الآن كيوباجيريكويست كائن قدم الذي يسمح للفرز عبر كيريدسل لتضاف إلى بيانات الربيع جبا الاستعلام دسل...
هنا هو وسيلة أبسط من ذلك بكثير لبناء Sort
كائن باستخدام كيريدسل:
new QSort(user.manager.firstname.asc())
ثم يمكنك استخدامه في PageRequest
مثل ذلك:
new PageRequest(0, 10, new QSort(user.manager.firstname.asc()))
ال getExpression()
تمت إزالة الأسلوب ، وكان لي تعبيرات أقرب إلى QPost.post.period.periCode
التي مطلوب اجتياز ، وبدون الاسم الكامل للتعبير لم أستطع فعل أي شيء حيال ذلك ، لذلك قمت الآن بعمل طريقة تجمع period.periCode
ويعمل تماما على 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);