这基本上是相反的操作:
如何在Spring JPA中进行分页QueryDSL查询?
这是针对无法使用任何findAll()方法的自定义查询。
编辑: 发布了错误的链接,现已更正。
编辑: 发布了错误的链接,现已更正。
if (pageable != null) {
query.offset(pageable.getOffset());
query.limit(pageable.getPageSize());
for (Sort.Order o : pageable.getSort()) {
PathBuilder<Object> orderByExpression = new PathBuilder<Object>(Object.class, "object");
query.orderBy(new OrderSpecifier(o.isAscending() ? com.mysema.query.types.Order.ASC
: com.mysema.query.types.Order.DESC, orderByExpression.get(o.getProperty())));
}
}
我不知道这是否仍然相关,但在Spring Data JPA中有一种实现可以将data.domain.Sort(Spring JPA)对象转换为OrderSpecifier(QueryDSL)。
这是一个非常丑陋的实现,但您仍然可以将其用于自己的目的,因为该方法是私有的:
public JPQLQuery applySorting(Sort sort, JPQLQuery query)
但是如果您使用Spring Data JPA,在自定义的Repository实现中,您只需要执行以下操作:
public Page<MyObject> findAll(Predicate predicate, Pageable pageable) {
QMyObject myObject = QMyObject.myObject;
JPQLQuery jPQLQuery = from(myObject)
.join(myObject.user)
.where(predicate);
jPQLQuery = getQuerydsl().applyPagination(pageable, jPQLQuery);
List<MyObject> myObjectList = jPQLQuery.list(myObject);
long count = jPQLQuery.count();
Page<MyObject> myObjectPage = new PageImpl<MyObject>(myObjectList, pageable, count);
return myObjectPage;
}
希望它能有所帮助!
private OrderSpecifier<?>[] getSortedColumn(Sort sorts){
return sorts.toList().stream().map(x ->{
Order order = x.getDirection().name() == "ASC"? Order.ASC : Order.DESC;
SimplePath<Object> filedPath = Expressions.path(Object.class, Qobject, x.getProperty());
return new OrderSpecifier(order, filedPath);
}).toArray(OrderSpecifier[]::new);
}
然后你可以像这样使用:
.where(...),
.orderBy(getSortedColumn(pageable.getSort()))
objectDTO
是什么? - Marinos Anorg.springframework.data.domain.Sort.Order
和com.querydsl.core.types.Order
非常相似,但两者之间没有直接的转换方法。这是frozenfury答案的改进版本:
PathBuilder<Entity> entityPath = new PathBuilder<>(Entity.class, "entity");
for (Order order : pageable.getSort()) {
PathBuilder<Object> path = entityPath.get(order.getProperty());
query.orderBy(new OrderSpecifier(com.querydsl.core.types.Order.valueOf(order.getDirection().name()), path));
}
或者,如果您想直接将排序应用于基本查询而无需转换为OrderSpecifier<?>,您可以利用org.springframework.data.jpa.repository.support.Querydsl
。
JPQLQuery<?> query = new JPAQuery<>(entityManager);
//prepare your base query
query.select(<YourQEntity>).from(<YourQEntity>).where(<whereClause>);
Querydsl querydsl = new Querydsl(entityManager, (new PathBuilderFactory()).create(<YourEntityClass>.class));
//apply org.springframework.data.domain.Sort
querydsl.applySorting(pageable.getSort(), query);