Как я могу преобразовать пружинную сортировку данных в querydsl OrderSpecifier?

Это в основном противоположность этому:Как выполнить постраничный запрос QueryDSL с помощью Spring JPA?

Это для пользовательского запроса, для которого я могуt использовать любой из методов findAll ().

РЕДАКТИРОВАТЬ:

Выложил не ту ссылку. Сейчас исправлено.

Ответы на вопрос(3)

Решение Вопроса

Вы можете сделать что-то вроде этого: Но не забудьте обрезать o.getProperty (), чтобы вы только передавали свойство, а не "псевдоним «.+ недвижимость

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

 Cenobyte32106 сент. 2016 г., 19:48
Этот вид работает для моего случая, но не полностью. Проблема в том, что мне нужно отсортировать вычисляемые поля (сумма, количество). У меня есть их как псевдонимы, но проблема в том, что PathBuilder всегда добавляет к запросу "псевдоним «. + собственность. В примере это всегда возвращаетORDER BY object. {Alias} " который недействителен. Как я могу получить QueryDSL просто добавить "ЗАКАЗАТЬ {псевдоним} "?
 beginner_27 окт. 2012 г., 16:49
помечен как ответ, так как мой вопрос был дан ответ, и я пришел к тому же решению, за исключением использования MyClass.class вместо Object.class. Однако, как мне сделать это в общем, например, MyClass на самом деле <T расширяет MyClass>?
 Timo Westkämper29 окт. 2012 г., 08:12
Вы должны повторно использовать orderByExpression, поскольку он является общим родителем для заказа дочерними элементами. Также имя вводит в заблуждение, так как дети являются фактическимизаказ по выражениям ".

Я неНе знаю, является ли это все еще актуальным, но в jpa данных пружины есть реализация для преобразования между объектом data.domain.Sort (Spring JPA) в OrderSpecifier (QueryDSL).

GIT Источник поддержки Querydsl весной JPA

Это действительно уродливая реализация, но вы все равно можете использовать ее для своих собственных целей, так как метод является приватным:

public JPQLQuery applySorting(Sort sort, JPQLQuery query)

Но если вы используете JPA данных Spring в своей собственной реализации репозитория, вам просто нужно сделать:

public Page findAll(Predicate predicate, Pageable pageable) {

    QMyObject myObject = QMyObject.myObject;
    JPQLQuery jPQLQuery = from(myObject)
            .join(myObject.user)
            .where(predicate);
    jPQLQuery = getQuerydsl().applyPagination(pageable, jPQLQuery);
    List myObjectList = jPQLQuery.list(myObject);
    long count =  jPQLQuery.count();
    Page myObjectPage = new PageImpl(myObjectList, pageable, count);
    return myObjectPage;  
}

Надеюсь, это может помочь!

org.springframework.data.domain.Sort.Order а такжеcom.querydsl.core.types.Order и так похожи, но между ними нет прямого преобразования. Это несколько улучшенная версияfrozenfury ответ:

PathBuilder entityPath = new PathBuilder(Entity.class, "entity");
for (Order order : pageable.getSort()) {
    PathBuilder path = entityPath.get(order.getProperty());
    query.orderBy(new OrderSpecifier(com.querydsl.core.types.Order.valueOf(order.getDirection().name()), path));
}

Ваш ответ на вопрос