首页 > 其他分享 >使用Specification实现多条件、特定顺序和类型转换排序的 分页查询

使用Specification实现多条件、特定顺序和类型转换排序的 分页查询

时间:2023-04-07 16:33:08浏览次数:37  
标签:类型转换 OrderPo get Specification _. criteriaBuilder 排序 root orders

  今天项目中遇到了一个特殊的要求,要按照指定的顺序,在分页查询的时候进行排序(jpa)。

  原始的排序方式:

    criteriaQuery.where(predicateList.toArray(new Predicate[0]))
                        .orderBy(
                                criteriaBuilder.asc(root.get(Order_.adminDate)),
                                criteriaBuilder.desc(root.get(Order_.centerCode)),
                                criteriaBuilder.desc(root.get(Order_.productId)),
                                criteriaBuilder.desc(root.get(Order_.cancelType))
                        );

  要在此基础上进行指定排序:

  版本1:对当前也的查询结果进行分页——通过对结果list进行排序,但是不能满足需求。

 1  String[] regulation = {"AA", "BB", "CC"};
 2             final List<String> regulationOrder = Arrays.asList(regulation);
 3             return orderCancelReviewLogVoList.stream().sorted(
 4                     Comparator.comparing(OrderVo::getProductId, new Comparator<String>() {
 5                                 @Override
 6                                 public int compare(String o1, String o2) {
 7                                     int io1 = regulationOrder.indexOf(o1.toUpperCase(Locale.ROOT));
 8                                     int io2 = regulationOrder.indexOf(o2.toUpperCase(Locale.ROOT));
 9                                     return io1 - io2;
10                                 }
11                             })
12                             .thenComparing(new Comparator<OrderVo>() {
13                                 @Override
14                                 public int compare(OrderVoo1, OrderVoo2) {
15                                     Integer centerCodeOne = Integer.parseInt(o1.getCenterCode());
16                                     Integer centerCodeTwo = Integer.parseInt(o2.getCenterCode());
17                                     return centerCodeOne - centerCodeTwo;
18                                 }
19                             })
20                             .thenComparing(OrderVo::getAdminDate)
21             ).collect(Collectors.toList());

  版本2:直接在jpa,分页查询时,对Order进行自定义,同时通过As方法进行类型转换

 1  List<Order> orders = new ArrayList<>();
 2                 orders.add(criteriaBuilder.asc(criteriaBuilder.selectCase()
 3                         .when(criteriaBuilder.equal(root.get(OrderPo_.productId), "AA"), 1)
 4                         .when(criteriaBuilder.equal(root.get(OrderPo_.productId), "BB"), 2)
 5                         .when(criteriaBuilder.equal(root.get(OrderPo_.productId), "CC"), 3)
 6                         .otherwise(4)));
 7                 orders.add(criteriaBuilder.asc(root.get(OrderPo_.centerCode).as(Integer.TYPE)));
 8                 orders.add(criteriaBuilder.asc(root.get(OrderPo_.adminDate)));
 9                 orders.add(criteriaBuilder.desc(root.get(OrderPo_.cancelType)));
10 
11                 criteriaQuery.where(predicateList.toArray(new Predicate[0]))
12                         .orderBy(orders);

 

生成SQL

此时等于WHEN后面的字段内容就会按照THEN后面的1234的顺序进行ASC升序排序。

先来看pgsql中的写法
SELECT a.A FROM table_a a ORDER BY CASE a.A WHEN '你好' THEN 1 WHEN '我好' THEN 2 WHEN '大家好' THEN 3 WHEN '是真滴好' THEN 4 END ASC

 

标签:类型转换,OrderPo,get,Specification,_.,criteriaBuilder,排序,root,orders
From: https://www.cnblogs.com/hobby0524/p/17296624.html

相关文章

  • 153. 寻找旋转排序数组中的最小值
    已知一个长度为n的数组,预先按照升序排列,经由1到n次旋转后,得到输入数组。例如,原数组nums=[0,1,2,4,5,6,7]在变化后可能得到:若旋转4次,则可以得到[4,5,6,7,0,1,2]若旋转7次,则可以得到[0,1,2,4,5,6,7]注意,数组[a[0],a[1],a[2],...,a[n-1]]旋转一次的结果为数......
  • UVA - 10905 Children's Game 字符串的排序
    题目大意:给出N个数字串,要求拼出有数字最大的串解题思路:用string就很好解决#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>usingnamespacestd;constintmaxn=60;stringstr[maxn];intcmp(stringa,stringb){ returna+b>b+a;}......
  • Java-Day-5(数组 + 排序 + 查找 + 二维数组)
    Java-Day-5数组可以存放多个同一类型的数据,属于引用类型动态初始化语法:数据类型数组名[]=new数据类型[大小]例:int[]a=newint[5]或:doublea[]=newdouble[n]使用(引用/访问/获取)时,初始下标(索引)是从0开始,第一个数=a[0]获取长度:数组名.length......
  • 题目 1023: [编程入门]选择排序
    找出数组无序区中的最小值(最大值),与无序区中第一个数(最后一个数)交换。例子:52314第一轮无序区最小值是1,将1和无序区中一个数交换:12354。有序区:1,无序区:2354第二轮无序区最小值是2,因为2就是无序区的第一个数,所以不用交换:12354。有序区:12,无序区:354第三轮无序......
  • java -- System类和冒泡排序
    Systemjava.lang.System类中提供了大量的静态方法,可以获取与系统相关的信息或系统级操作。System类私有修饰构造方法,不能创建对象,直接类名调用。exit//终止当前运行的Java虚拟机,非零表示异常终止publicstaticvoidexit(intstatus)currentTimeMillis//返回当前时间(......
  • HashMap排序方法,少见的toArray转为Array 泛型数组 排序,而非ArrayList
        HashMap<String,Integer>hm=newHashMap<>();    hm.put("a",1);    hm.put("c",2);    hm.put("b",3);         Set<Entry<String,Integer>>entrySet=hm.entrySet();      ......
  • C# List按照自定义的顺序去排序
    有没有遇到过产品经理说表格输出排序要按照指定的人员列表去排序?经过一番研究搜查发现一个方法可以实现话不多说上例子 publicclassUserInfo{publicstringName{get;set;}publicstringInfo{get;set;}} List<UserInfo>userInfos=newList<Use......
  • 王道C语言笔记NOTE-中级阶段Note8-排序算法真题实战
    一、2016年43题1、问题描述2、答案解析(1)、算法的基本设计思想由题意知,将最小的n/2个元素放进A1中,剩余元素放在A2中,分组结果即可满足题目要求。仿照快速排序的思想,基于枢轴把n个整数划分成两个子集,根据划分后枢轴所处的位置i分别处理:①、若i=n/2,则分组完成,算法结束;②、若i<......
  • Map自定义key,然后把value的集合List进行指定字段排序
    packagecom.zdft.purchase;importcom.google.common.collect.Lists;importjava.util.*;importjava.util.stream.Collectors;publicclassStudentMethod{//需求:Map自定义key,然后把value的集合List进行指定字段排序;例如:多次考试,取最高分的集合展示publics......
  • 列表中有整数、有特殊字符、有字母的排序问题
    列表中有整数、有特殊字符、有字母a=[2,1,3,5,4,'d','f','e','c','a','b','?','*','&']#定义一个函数defsort1(x):ifisinstance(x,int):  #判断传入的参数中是否有整数returnx #有整数返回整数本身......