如何在 SpringData 和 QueryDsl 中指定多列 OrderSpecifier?这可能吗

Posted

技术标签:

【中文标题】如何在 SpringData 和 QueryDsl 中指定多列 OrderSpecifier?这可能吗【英文标题】:How do you specify multi-column OrderSpecifier for use in SpringData and QueryDsl? Is this possible 【发布时间】:2013-12-04 02:25:08 【问题描述】:

所以我有以下查询:

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;

上面的查询工作正常。但是,我想先按dealerType 对结果进行排序,然后按dealerCode 排序,有点像“按dealerType asc,dealerCode desc 排序”。如何实例化 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、dealerCode desc”进行排序的要求。

任何帮助将不胜感激。提前致谢。

尼克

【问题讨论】:

【参考方案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); 

让我们知道它是否有效。这是一个指向 *** 问题/答案的链接,它解释了 findAll() 方法上的 ... 参数语法:

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

这意味着您可以将任意数量的 OrderSpecifiers 作为函数的可选参数。

【讨论】:

刚刚测试了上面提供的解决方案。有用!感谢大卫的快速回复。我们很感激。 这就是参数列表中 ... 的含义。这是我刚刚从您的回答中学到的另一点。为了让那些可能偶然发现这篇文章的人受益,这里是 findAll 的方法定义:Iterable findAll(Predicate predicate, OrderSpecifier>... orders)。再次感谢大卫【参考方案2】:

如果您不想为每个说明符创建变量,可以这样做:

OrderSpecifier<?>[] sortOrder = new OrderSpecifier[] 
    QDealer.dealer.dealerType.asc(),
    QDealer.dealer.dealerCode.desc()
;
Iterable<Dealer> results = dlrRpstry.findAll(where, sortOrder); 

【讨论】:

以上是关于如何在 SpringData 和 QueryDsl 中指定多列 OrderSpecifier?这可能吗的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Querydsl 和 Spring Data 轻松实现“REST API 查询语言”来过滤实体?

在 MongoDB 中使用 QueryDSL - java.lang.NoClassDefFoundError

在 Spring Data 中为同一 QueryDSL 路径创建多个别名

将 Querydsl 与 Spring Data 一起使用时的最佳实践

Spring Data JPA - 规范和 Querydsl

Spring 数据规范或 QueryDSL