如何在 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如果您不想为每个说明符创建变量,可以这样做:
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 一起使用时的最佳实践