温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

JPA Specification常用查询有哪些

发布时间:2021-11-18 16:46:06 来源:亿速云 阅读:196 作者:iii 栏目:开发技术

这篇文章主要讲解了“JPA Specification常用查询有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“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的不多,发个我刚做过的接口的过程吧。

    需求

    JPA Specification常用查询有哪些

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

    开始了

    一、dao

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

    JPA Specification常用查询有哪些

    二、service

    JPA Specification常用查询有哪些

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

    三、排序

    需要先建一个辅助的实体类,属性名我取和需要排序的实体类一样的名字,但是注意属性都是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类一致,但是不一样的同学需要注意了。

    前端

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

    JPA Specification常用查询有哪些

    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 ?

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

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

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI