JPA Specification常用查询+排序实例

 更新时间:2021年11月18日 15:17:41   作者:afaye_  
这篇文章主要介绍了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 ?

可以看到条件查询,升序、降序都有。

结束语

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 轻松掌握Java工厂模式、抽象工厂模式

    轻松掌握Java工厂模式、抽象工厂模式

    这篇文章主要帮助大家轻松掌握Java工厂模式、抽象工厂模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • 关于 Java 的数据结构链表

    关于 Java 的数据结构链表

    这篇文章主要介绍了关于 Java 的数据结构链表的相关资料,需要的朋友可以参考下面文章内容
    2021-09-09
  • 如何在Java中实现一个散列表

    如何在Java中实现一个散列表

    这篇文章主要介绍了如何在Java中实现一个散列表,建一个HashMap,以String类型为Key,Int类型为Value,下文具体的操作过程需要的小伙伴可以参考一下
    2022-04-04
  • 快速解决commons-fileupload组件无法处理自定义head信息的bug

    快速解决commons-fileupload组件无法处理自定义head信息的bug

    问题在于fileupload组件解析完自定义的head节点后,却忘记传递到FileItemStreamImpl中了,稍作修订,即可修正该bug
    2013-08-08
  • Maven项目引用第三方jar包找不到类ClassNotFoundException

    Maven项目引用第三方jar包找不到类ClassNotFoundException

    这篇文章主要为大家介绍了Maven项目引用第三方jar包找不到类ClassNotFoundException解决及原因分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • windows下zookeeper配置java环境变量的方法

    windows下zookeeper配置java环境变量的方法

    今天小编就为大家分享一篇关于windows下zookeeper配置java环境变量的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • OpenJDK源码调试图文教程

    OpenJDK源码调试图文教程

    这篇文章主要介绍了OpenJDK源码调试,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • Java中强引用,软引用,弱引用概念解析

    Java中强引用,软引用,弱引用概念解析

    这篇文章主要介绍了Java中强引用,软引用,弱引用概念解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • java查找无向连通图中两点间所有路径的算法

    java查找无向连通图中两点间所有路径的算法

    这篇文章主要介绍了java查找无向连通图中两点间所有路径的算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • SpringBoot中异常处理实战记录

    SpringBoot中异常处理实战记录

    在我们实际项目开放中经常需要我们处理很多的异常,如何在spring boot项目里面实现异常处理呢,下面这篇文章主要给大家介绍了关于SpringBoot中异常处理的相关资料,需要的朋友可以参考下
    2022-05-05

最新评论