JPA Specification常用查询+排序实例
https://www.jb51.net/article/229599.htm#_label1
JPA Specification常用查询+排序
1.第一步:继承父类
1 | public interface TblCarton2RCardLogRepository extends JpaRepository<TblCarton2RCardLog, String>,JpaSpecificationExecutor<TblCarton2RCardLog> { |
2.第二步
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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类型的啊。后面细说,先上我建的辅助类。
1 2 3 4 5 6 7 8 9 | @Data public class DeptSort { private String id; //编码 private String name; //名称 private String highDeptName; //上级部门 private String principal; //负责人 private String deptType; //部门类型 private String enable; //启用 } |
字段都是需要排序的字段,这是为了好区分,叫别的也可以。
下面是controller层,排序功能的具体实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | 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辅助类。首先建立
集合,然后if判断将参数加入集合。
需要说明的是类似
语句,“enable”是需要查询的Businessdept里的字段,不是辅助类的,当然这里我的辅助类和Businessdept类一致,但是不一样的同学需要注意了。
前端
对于前端传递的参数有什么要求呢?
deptSort的各个属性的参数只能限定两种asc和desc,即升序和降序。上图的功能需求只需要传deptSort里的一个属性就可以了,这里传两个参数演示一下。
查询成功的数据不展示了,给大家看一个后台的SQL语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | 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 ? |
可以看到条件查询,升序、降序都有。
结束语
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
<div class="art_xg">
<b>您可能感兴趣的文章:</b><ul><li><a href="/article/198695.htm" title="Spring data jpa的使用与详解(复杂动态查询及分页,排序)" target="_blank">Spring data jpa的使用与详解(复杂动态查询及分页,排序)</a></li><li><a href="/article/111056.htm" title="Spring Data JPA 简单查询--方法定义规则(详解)" target="_blank">Spring Data JPA 简单查询--方法定义规则(详解)</a></li><li><a href="/article/175679.htm" title="Spring Data Jpa的四种查询方式详解" target="_blank">Spring Data Jpa的四种查询方式详解</a></li><li><a href="/article/110183.htm" title="Spring Data JPA实现动态查询的两种方法" target="_blank">Spring Data JPA实现动态查询的两种方法</a></li></ul>
</div>
</div>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~