如何在 Spring Data (JPA) 派生查询中按多个属性排序?
Posted
技术标签:
【中文标题】如何在 Spring Data (JPA) 派生查询中按多个属性排序?【英文标题】:How to sort by multiple properties in Spring Data (JPA) derived queries? 【发布时间】:2014-10-12 09:50:26 【问题描述】:我正在查看此页面 (https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.repositories) 上关于方法命名的示例,是否可以创建一个复杂的链方法名称,例如
findByProgrammeAndDirectorAndProgDateBetweenOrderByProgDateStartTimeAsc
在他们给出的示例中,他们只对一个值执行 OrderBy。在上面的示例中,ProgDate
和 StartTime
将是两个单独的值。
【问题讨论】:
你试过了吗?它应该可以工作。 【参考方案1】:我正在分享另一种方法代码 sn-p 用于实现 get 操作,其中执行按多列排序的排序操作
List<Order> orders = new ArrayList<Order>();
Order StartTimeOrder = new Order(Sort.Direction.DESC, "StartTime");
orders.add(StartTimeOrder);
Order progDateOrder = new Order(Sort.Direction.ASC, "ProgDate");
orders.add(progDateOrder);
return repository.findAll(Sort.by(orders));
【讨论】:
谢谢,这就是我要找的。span> 【参考方案2】:诀窍是使用方向关键字Asc
和Desc
简单地分隔要排序的属性。因此,您的查询方法中可能想要的是:
…OrderByProgDateAscStartTimeAsc
注意,我们如何通过Asc
结束第一个属性定义并继续处理下一个属性。
一般来说,一旦方法名称超过一定长度或复杂性,我们建议切换到基于 @Query
的查询。主要原因是客户调用这些非常长的方法很尴尬。使用@Query
,您宁愿获得查询语言的全部功能以及合理大小的方法名称,该名称可能是更高级的语言来表达查询的意图。
【讨论】:
有没有办法通过JoinColumn
id 订购?谢谢
@Laxman 检查这个:***.com/questions/28084064/…
没有条件是不行的。所以 findByIdOrderByStartAscIdDesc 有效,但 findAllOrderByStartAscIdDesc 无效。
是否可以将OrderBy
方法关键字与Sort
参数组合到Pageable
对象中?【参考方案3】:
是的,应该可以:
试试这个:
findByProgrammeAndDirectorAndProgDateBetweenOrderByProgDateStartTimeAsc(String programme, String director, Date progStart, Date progEnd);
我没有测试过代码,但根据我已经做过的事情,它应该可以工作。
【讨论】:
那个签名正确吗?我认为 Between 涵盖了 progStart 和 progEnd,但是 OrderByProgDateStartTimeAsc 是否需要额外的两个参数? @PaulStatham 我相信这是对的。之间需要两个日期,订单不需要任何参数,因为您指示按与列匹配的值进行排序,如 SQL ... ORDER BY ProgDateStartTime ASC以上是关于如何在 Spring Data (JPA) 派生查询中按多个属性排序?的主要内容,如果未能解决你的问题,请参考以下文章