SpringBoot--jpa之Sort查询 - Go语言中文社区

SpringBoot--jpa之Sort查询


背景:

在操作数据上,我们可能要对数据进行排序,比如SQL语句中的OrderBy等,在JPQL中,在查询语句中传入Sort类相关属性即可得到相应的结果。

代码演示:

在传入参数的时候,你可以new实例化Sort类,在构造器中传入相应的排序规则和要排序的属性,代码:
Dao

  @Query("SELECT p FROM Person p WHERE p.firstName LIKE %?1%")
   public List<Person> findPersonBySort(String userName, Sort sort);

Dao测试类:

dao.findPersonBySort("ta", new Sort("firstname"))

在这里插入图片描述

官网给的例子竟然deprecated了。。why?
分析一下。。。

所有的排序,都有一种顺序,我们把它定义为大或者小,儿Sort只有一个参数的构造器是没有传递大小的排序规则的
进入源码分析:
在这里插入图片描述
原来是有一个默认的排序规则
public static final Direction DEFAULT_DIRECTION = Direction.ASC;
默认是升序的规则,为什么废弃调没有排序规则的这个构造方法,可能作者认为在排序的时候就如你写SQL时一样,必须指定规则,所以,一定有个构造方法是指定了排序规则和要排序的字段。

所以就有了:
在这里插入图片描述
又或者:
在这里插入图片描述

用实体之外的字段对查询结果排序

除了对查询实体的字段进行排序,我们可能会有这样的需求:
比如:用实体中的某个字段的长度进行排序

@Test
 public void getPersonBySort() {
     System.out.println(dao.findPersonBySort("ta", Sort.by(Sort.Direction.ASC, "LENGTH(lastName)")));
 }

这样看起来顺利成章,运行一下

org.springframework.dao.InvalidDataAccessApiUsageException: Sort expression 'LENGTH(lastName): ASC' must only contain property references or aliases used in the select clause. If you really want to use something other than that for sorting, please use JpaSort.unsafe()!

在这里插入图片描述

抛异常了。。。异常信息中也告诉我们不能这样用,正确的打开方式应该是:

@Test
 public void getPersonBySort() {
     System.out.println(dao.findPersonBySort("ta", JpaSort.unsafe(Sort.Direction.ASC, "LENGTH(lastName)")));
 }

运行结果:
在这里插入图片描述

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/tangyaya8/article/details/83719363
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢