如何将弹簧数据Sort转换为querydsl OrderSpecifier?

beg*_*er_ 12 querydsl spring-data

这基本上与此相反: 如何使用Spring JPA进行分页QueryDSL查询?

这是一个自定义查询,我不能使用任何findAll()方法.

编辑:

发布了错误的链接.现在纠正了.

Fra*_*ank 17

你可以做这样的事情:但是一定要修剪o.getProperty(),这样你才能传递属性而不是"别名".+ property


    if (pageable != null) {
                query.offset(pageable.getOffset());
                query.limit(pageable.getPageSize());
                for (Sort.Order o : pageable.getSort()) {
                    PathBuilder orderByExpression = new PathBuilder(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())));
                }
            }


exi*_*z31 8

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

Spring JPA 中 Querydsl 支持的 GIT 源

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

public JPQLQuery applySorting(Sort sort, JPQLQuery query)
Run Code Online (Sandbox Code Playgroud)

但是如果您使用 Spring 数据 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;  
}
Run Code Online (Sandbox Code Playgroud)

希望它可以帮助!


Jun*_*Yeo 5

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);
}
Run Code Online (Sandbox Code Playgroud)

那么你可以这样使用:

  .where(...), 
  .orderBy(getSortedColumn(pageable.getSort()))
Run Code Online (Sandbox Code Playgroud)