千家信息网

JPA Specification常用查询有哪些

发表于:2025-01-24 作者:千家信息网编辑
千家信息网最后更新 2025年01月24日,这篇文章主要讲解了"JPA Specification常用查询有哪些",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"JPA Specification常
千家信息网最后更新 2025年01月24日JPA Specification常用查询有哪些

这篇文章主要讲解了"JPA Specification常用查询有哪些",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"JPA Specification常用查询有哪些"吧!

    JPA Specification常用查询+排序

    1.第一步:继承父类

    public interface TblCarton2RCardLogRepository extends JpaRepository,JpaSpecificationExecutor {

    2.第二步

    tblCarton2RCardLogRepository.findAll(new Specification() {    @Override    public  Predicate toPredicate(Root root, CriteriaQuery query,CriteriaBuilder cb) {        List list = new ArrayList();        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的不多,发个我刚做过的接口的过程吧。

    需求

    看到图了吗?需要实现搜索以及各种字段的排序还要分页,还有可能有选择各种条件的下拉列表,是不是很变态?

    开始了

    一、dao

    需要先处理dao层,这里喜欢叫repository。做一个实体类的dao层接口,继承JpaSpecificationExecutor,再写一个查询接口。

    二、service

    在这里主要处理的是查询条件,我这里是搜索功能的模糊查询,当然如果有更多的查询也可以添加进这里。这里需要注意的是specification。

    三、排序

    需要先建一个辅助的实体类,属性名我取和需要排序的实体类一样的名字,但是注意属性都是String类型的啊。后面细说,先上我建的辅助类。

    @Datapublic 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 orders = new ArrayList();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 all = service.findAll(search, pageable);model = ResponseModel.getSuccessResponseModel().setData(all);}catch (Exception e){e.printStackTrace();model = ResponseModel.getFailedResponseModel();}return model;}

    需要的参数有搜索内容search,还有DeptSort辅助类。首先建立

    List orders = new ArrayList();

    集合,然后if判断将参数加入集合。

    需要说明的是类似

    orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getEnable()),"enable"))

    语句,"enable"是需要查询的Businessdept里的字段,不是辅助类的,当然这里我的辅助类和Businessdept类一致,但是不一样的同学需要注意了。

    前端

    对于前端传递的参数有什么要求呢?

    deptSort的各个属性的参数只能限定两种asc和desc,即升序和降序。上图的功能需求只需要传deptSort里的一个属性就可以了,这里传两个参数演示一下。

    查询成功的数据不展示了,给大家看一个后台的SQL语句

    Hibernate: /* selectcount(generatedAlias0) fromBusinessdept as generatedAlias0 where(generatedAlias0.name like :param0 ) and (generatedAlias0.deleteIs=1 ) */ selectcount(businessde0_.id) as col_0_0_ fromt_department businessde0_ where(businessde0_.name like ?) and businessde0_.delete_is=1Hibernate: /* selectgeneratedAlias0 fromBusinessdept as generatedAlias0 where(generatedAlias0.name like :param0 ) and (generatedAlias0.deleteIs=1 ) order bygeneratedAlias0.deptType asc,generatedAlias0.enable desc */ selectbusinessde0_.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_ fromt_department businessde0_ where(businessde0_.name like ?) and businessde0_.delete_is=1 order bybusinessde0_.dept_type asc,businessde0_.enable desc limit ?

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

    感谢各位的阅读,以上就是"JPA Specification常用查询有哪些"的内容了,经过本文的学习后,相信大家对JPA Specification常用查询有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

    0