Как указать многостолбцовый OrderSpecifier для использования в SpringData и QueryDsl? Это возможно

Итак, у меня есть следующий запрос ниже:

public Iterable<Dealer> findAll(Dealer dealer) {
    QDealer qdealer = QDealer.dealer;

    BooleanExpression where = null;
    if(dealer.getId() != null && dealer.getId() != 0) {
        buildPredicate(qdealer.id.goe(dealer.getId()));
    }

    OrderSpecifier<String> sortOrder = QDealer.dealer.dealerCode.desc();
    Iterable<Dealer> results = dlrRpstry.findAll(where, sortOrder); 
    return results;
}

Запрос выше работает нормально. Тем не менее, я хотел бы сначала отсортировать результаты по дилерскому типу, а затем по дилерскому коду, что-то вроде «заказ по дилерскому типу по возрастанию, дилерскому коду по убыванию». Как мне создать экземпляр OrderSpecifier, чтобы результаты сортировались по дилерскому типу, а затем по коду дилера.

DealerRepository dlrRpstry расширяет JpaRepository, QueryDslPredicateExecutor

Я использую spring-data-jpa-1.1.0, spring-data-commons-dist-1.3.2 и querydsl-jpa-2.9.0.

Если OrderSpecifier не может быть настроен на порядок сортировки с несколькими столбцами, каким будет альтернативное решение, которое удовлетворит мое требование сортировки результатов «по дилерскому типу asc, дилерскому коду desc».

Любая помощь будет принята с благодарностью. Заранее спасибо.

Ник


person Dominique Morales    schedule 20.11.2013    source источник


Ответы (1)


У меня нет настройки установки JPA, но я считаю, что, прочитав документацию QueryDslJpaRepository, вы можете просто сделать это:

OrderSpecifier<String> sortOrder1 = QDealer.dealer.dealerType.asc();
OrderSpecifier<String> sortOrder2 = QDealer.dealer.dealerCode.desc();
Iterable<Dealer> results = dlrRpstry.findAll(where, sortOrder1, sortOrder2); 

Дайте нам знать, если это работает. Вот ссылка на вопрос/ответ stackoverflow, который объясняет синтаксис параметра ... в методе findAll():

https://stackoverflow.com/a/12994104/2879838

Это означает, что вы можете иметь столько OrderSpecifiers, сколько хотите, в качестве необязательных параметров функции.

person David Fleeman    schedule 20.11.2013
comment
Только что протестировал предложенное выше решение. Оно работает! Спасибо Давид за быстрый ответ. Мы ценим это. - person Dominique Morales; 21.11.2013
comment
Вот что означает ... в списке параметров. Это еще один момент, который я только что узнал из вашего ответа. Для тех, кто может наткнуться на этот пост, вот определение метода findAll: Iterable‹T› findAll(Predicate predicate, OrderSpecifier‹?›... orders). Еще раз большое спасибо Дэвид - person Dominique Morales; 21.11.2013