JPA Specification常用查询+排序实例
作者:afaye_ 发布时间:2023-11-23 04:56:32
标签:JPA,Specification,查询,排序
JPA Specification常用查询+排序
1.第一步:继承父类
public interface TblCarton2RCardLogRepository extends JpaRepository<TblCarton2RCardLog, String>,JpaSpecificationExecutor<TblCarton2RCardLog> {
2.第二步
tblCarton2RCardLogRepository.findAll(new Specification<TblCarton2RCardLog>() {
@Override
public Predicate toPredicate(Root<TblCarton2RCardLog> root, CriteriaQuery<?> query,CriteriaBuilder cb) {
List<Predicate> list = new ArrayList<Predicate>();
list.add(cb.equal(root.get("cartonNo").as(String.class), cartonNo));//某普通字段
list.add(cb.equal(root.get("id").get("rCard").as(String.class), rCard));//主键中某字段
list.add(cb.like(root.get("mocode").as(String.class), "%" + mocode + "%"));//like
list.add(cb.between(root.get("frozenDate").as(Long.class), frozenDateStart, frozenDateEnd));//between and
list.add(cb.greaterThanOrEqualTo(root.get("id").get("rcard").as(String.class), rCardStart));//大于等于
list.add(root.get("id").get("lotNo").as(String.class).in(lotNos));//in
//ORDER BY packdate DESC,packtime DESC
Predicate[] p = new Predicate[list.size()];
query.where(cb.and(list.toArray(p)));
query.orderBy(cb.desc(root.get("packDate")),cb.desc(root.get("packTime")));
return query.getRestriction();
}
});
JPA Specification复杂查询+排序
刚使用spring-data-jpa,遇到不少难题,网上查了很多资料,发现讲jpa的不多,发个我刚做过的接口的过程吧。
需求
看到图了吗?需要实现搜索以及各种字段的排序还要分页,还有可能有选择各种条件的下拉列表,是不是很变态?
开始了
1.dao
需要先处理dao层,这里喜欢叫repository。做一个实体类的dao层接口,继承JpaSpecificationExecutor,再写一个查询接口。
2.service
在这里主要处理的是查询条件,我这里是搜索功能的模糊查询,当然如果有更多的查询也可以添加进这里。这里需要注意的是specification。
3.排序
需要先建一个辅助的实体类,属性名我取和需要排序的实体类一样的名字,但是注意属性都是String类型的啊。后面细说,先上我建的辅助类。
@Data
public class DeptSort {
private String id;//编码
private String name;//名称
private String highDeptName;//上级部门
private String principal;//负责人
private String deptType;//部门类型
private String enable;//启用
}
字段都是需要排序的字段,这是为了好区分,叫别的也可以。
下面是controller层,排序功能的具体实现。
public ResponseModel table(@RequestParam("search")String search,
@RequestParam("pageNumber")Integer pageNumber,
@RequestParam("pageSize")Integer pageSize,
@RequestBody DeptSort deptSort){
ResponseModel model = null;
try {
List<Sort.Order> orders = new ArrayList<Sort.Order>();
if (StringUtils.isNotBlank(deptSort.getId())){
orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getId()),"id"));
}
if (StringUtils.isNotBlank(deptSort.getName())){
orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getName()),"name"));
}
if (StringUtils.isNotBlank(deptSort.getHighDeptName())){
orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getHighDeptName()),"highDeptName"));
}
if (StringUtils.isNotBlank(deptSort.getPrincipal())){
orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getPrincipal()),"principal"));
}
if (StringUtils.isNotBlank(deptSort.getDeptType())){
orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getDeptType()),"deptType"));
}
if (StringUtils.isNotBlank(deptSort.getEnable())){
orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getEnable()),"enable"));
}
//orders不能为空,所以如果为空设置按id排序[/code][code] if (orders.size() == 0){
orders.add(new Sort.Order(Sort.Direction.ASC,"id"));
}
Sort sort = new Sort(orders);
Pageable pageable = new PageRequest(pageNumber,pageSize,sort);
Page<Businessdept> all = service.findAll(search, pageable);
model = ResponseModel.getSuccessResponseModel().setData(all);
}catch (Exception e){
e.printStackTrace();
model = ResponseModel.getFailedResponseModel();
}
return model;
}
需要的参数有搜索内容search,还有DeptSort辅助类。首先建立
List<Sort.Order> orders = new ArrayList<Sort.Order>();
集合,然后if判断将参数加入集合。
需要说明的是类似
orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getEnable()),"enable"))
语句,“enable”是需要查询的Businessdept里的字段,不是辅助类的,当然这里我的辅助类和Businessdept类一致,但是不一样的同学需要注意了。
前端
对于前端传递的参数有什么要求呢?
deptSort的各个属性的参数只能限定两种asc和desc,即升序和降序。上图的功能需求只需要传deptSort里的一个属性就可以了,这里传两个参数演示一下。
查询成功的数据不展示了,给大家看一个后台的SQL语句
Hibernate:
/* select
count(generatedAlias0)
from
Businessdept as generatedAlias0
where
(
generatedAlias0.name like :param0
)
and (
generatedAlias0.deleteIs=1
) */ select
count(businessde0_.id) as col_0_0_
from
t_department businessde0_
where
(
businessde0_.name like ?
)
and businessde0_.delete_is=1
Hibernate:
/* select
generatedAlias0
from
Businessdept as generatedAlias0
where
(
generatedAlias0.name like :param0
)
and (
generatedAlias0.deleteIs=1
)
order by
generatedAlias0.deptType asc,
generatedAlias0.enable desc */ select
businessde0_.id as id1_3_,
businessde0_.delete_is as delete_i2_3_,
businessde0_.dept_type as dept_typ3_3_,
businessde0_.enable as enable4_3_,
businessde0_.high_dept_id as high_dep5_3_,
businessde0_.high_dept_name as high_dep6_3_,
businessde0_.name as name7_3_,
businessde0_.principal as principa8_3_
from
t_department businessde0_
where
(
businessde0_.name like ?
)
and businessde0_.delete_is=1
order by
businessde0_.dept_type asc,
businessde0_.enable desc limit ?
可以看到条件查询,升序、降序都有。
结束语
来源:https://blog.csdn.net/haofengjiao/article/details/78582052


猜你喜欢
- 一、使用Pull解析器读取XML文件除了可以使用SAX或DOM解析XML文件之外,大家也可以使用Android内置的Pull解析器解析XML
- package com.happyelements.athene.game.util;import static com.google.co
- WPF 实现筛选下拉多选控件框架使用.NET4 至 .NET6;Visual Studio 2022;创建 MultiSelect
- 爱java 爱dota,突发奇想想用java开发dota操作最华丽的英雄之一的卡尔的技能,因为本人系小白,代码不足的地方还请包涵,有同样爱好
- 只需要调用该类的一个方法createNewFile(),但是在实际操作中需要注意一些事项,如判断文件是否存在,以及如何向新建文件中写入数据等
- try就像一个网,把try{}里面的代码所抛出的异常都网住,然后把异常交给catch{}里面的代码去处理。最后执行finally之中的代码。
- 基于SpringAOP已经实现统一功能增强,但如果希望对Controller增强,就无法获取其中的http请求数据。因此,实现以下这些统一增
- 深入理解IOC思想spring本质就在于将对象全部交由给spring容器创建和管理,由容器控制对象的整个生命周期、核心就是IOC控制反转和A
- 引入为什么突然说一下Spring启动原理呢,因为之前面试的时候,回答的那可谓是坑坑洼洼,前前后后,补补贴贴。。。总而言之就是不行,再次看一下
- 配置文件中设置通常在公司级别的项目中,我们可能会写多个application- dev/prod.yml ,然后我们通常会在applicat
- 学习初衷:在工作实际开发过程中,原有的安卓控件已不能满足实际的功能需求,而且有些应用还需要一些独特的展示效果,这时就需要自定义控件来定制控件
- 今天要介绍一个概念,对象的克隆。本篇有一定难度,请先做好心理准备。看不懂的话可以多看两遍,还是不懂的话,可以在下方留言,我会看情况进行修改和
- 本文实例讲述了WinForm绘制圆角的方法。分享给大家供大家参考。具体实现方法如下:using System;using System.Co
- 概述从今天开始, 小白我将带大家开启 Jave 数据结构 & 算法的新篇章.链表链表 (Linked List) 是一种递归的动态数
- 本文实例为大家分享了Android实现点击某个按钮指定位置弹出布局,供大家参考,具体内容如下package com.topcee.repor
- 从网上收集后自己写的一个方法;1.首先是一个根据分辨率压缩的类,首先对图片进行一次压缩 /** * 根据分辨率压缩图
- 写了一个过滤器,根据需要限制edittext输入的整数和小数位,如下代码:package allone.verbank.apad.clien
- 提示:这里咱们要说的常量池,常量池就是咱们面试中所说的常量池,谈谈你对常量池的认识?面试官一问咱们就懵逼了,你要记得你脑子中有一张图!!!
- 一、什么是反射机制 简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类
- //构造文件File类File f=new File(fileName);//判断是否为目录f.isDirectory();//获取目录下的