16

这基本上与此相反: How to do a paged QueryDSL query with Spring JPA?

这是针对我无法使用任何 findAll() 方法的自定义查询。

编辑:

发错链接了。现在更正了。

4

5 回答 5

22

您可以执行以下操作:但请确保修剪 o.getProperty() 以便您只传递属性而不是“别名”。+property

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())));
    }
}
于 2012-10-27T05:46:58.653 回答
8

我不知道它是否仍然相关,但是 spring data jpa 中有一个实现,用于在 data.domain.Sort (Spring JPA) 对象到 OrderSpecifier (QueryDSL) 之间进行转换。

Spring JPA 中 Querydsl 支持的 GIT 源码

这是一个非常丑陋的实现,但您仍然可以将它重用于自己的目的,因为该方法是私有的:

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;  
}

希望它可以帮助!

于 2014-03-03T14:32:34.460 回答
3

org.springframework.data.domain.Sort.Ordercom.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));
}
于 2017-11-25T11:39:06.083 回答
3
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()))
于 2020-11-27T04:57:25.517 回答
-1

或者,如果您想直接将排序应用到您的基本查询中,而不必转换为 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);
于 2021-02-10T01:45:55.950 回答