zoukankan      html  css  js  c++  java
  • JPA 多表分页查询

    业务场景:大学生毕业后统计毕业去向。学生实体和毕业去向实体一对一关系。

    实体:

    @Entity
    @Data
    @Table(name = "t_s_student")
    public class TSStudent implements Serializable {
    
        /**主键*/
        @Id
        @GeneratedValue(generator = "idGenerator")
        @GenericGenerator(name = "idGenerator",strategy = "uuid")
        @Column(length = 32)
        private String id;
    
        /**姓名*/
        @Column(name = "name")
        private String name;
    
        /**学号*/
        @Column(name = "student_id",length = 20)
        private String studentId;
    
        /**电话*/
        @Column(name = "phone",length = 20)
        private String phone;
    
        /**地址*/
        @Column(name = "address",length = 200)
        private String address;
    
        /**籍贯*/
        @Column(name = "birthplace",length = 200)
        private String birthplace;
        /**生日*/
    
        @Column(name = "birthday")
        private String birthday;
    
        /**毕业时间*/
        @Column(name = "graduation_time")
        private String graduationTime;
    
        /**班级*/
        @Column(name = "clazz",length = 50)
        private String clazz;
    
        /**
         * 性别
         */
        @Column(name = "sex",length = 5)
        private String sex;
    
        /**
         * 年级
         */
        @Column(name = "grade",length = 20)
        private String grade;
        /**
         * 成绩
         */
        @Column(name = "achievement",length = 20)
        private String achievement;
    
        /**
         * 毕业去向
         */
        @Column(name = "graduation",length = 100)
        private String graduation;
    
        /**
         * 所在地区
         */
        @Column(name = "area",length = 200)
        private String area;
    
        /**
         * QQ
         */
        @Column(name = "qq",length = 20)
        private String qq;
    
        /**
         * 行业
         */
        @Column(name = "industry",length = 20)
        private String industry;
    
    
    }
    

      毕业去向实体:

    @Entity
    @Table(name ="t_s_graduation")
    @Data
    public class TSGraduation implements Serializable {
    
        @Id
        @GeneratedValue(generator = "idGenerator")
        @GenericGenerator(name = "idGenerator",strategy = "uuid")
        @Column(length = 32)
        private String id;
    
        /**
         * 城市
         */
        @Column(name = "city",length = 50)
        private String city;
    
        /**
         * 公司名
         */
        @Column(name = "company",length = 100)
        private String company;
    
        /**
         * 公司地址
         */
        @Column(name = "company_address",length = 200)
        private String companyAddress;
    
        /**
         * 公司电话
         */
        @Column(name = "company_phone",length = 20)
        private String companyPhone;
    
        /**
         * 从事行业
         */
        @Column(name = "industry",length = 20)
        private String industry;
    
        /**
         * 所属地区
         */
        @Column(name = "area",length = 100)
        private String area;
    
        /**
         * 入职时间
         */
        @Column(name = "entry_time",length = 20)
        private String entryTime;
    
        /**
         * 薪资
         */
        @Column(name = "salary")
        private Integer salary;
    
        /**
         * 是否有五险一金
         */
        @Column(name = "has_insurance_and_housing_fund",length = 5)
        private String hasInsuranceAndHousingFund;
    
        /**
         * 关联学生ID
         */
        @OneToOne(cascade = CascadeType.ALL)//student 是关系的维护端,当删除学生的时候,会级联删除去向信息
        @JoinColumn(name = "student_id",referencedColumnName = "id")//去向中的student_id字段参考学生表中的ID字段
        private TSStudent student;
    }
    

      分页服务接口实现:

    @Override
        public Page<TSGraduation> search(TSGraduation graduation, AbstractPageRequest pageable) {
            return graduationRepository.findAll(new Specification<TSGraduation>() {
                @Override
                public Predicate toPredicate(Root<TSGraduation> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
    
                    List<Predicate> list = new ArrayList<>();
                    
                    //获取学生属性,查询条件
                    Join<Object, TSStudent> student = root.join("student", JoinType.LEFT);
    
                    if (graduation.getStudent() != null && !StringUtils.isEmpty(graduation.getStudent().getClazz())){
                        list.add(criteriaBuilder.like(student.get("clazz").as(String.class),"%" + graduation.getStudent().getClazz() + "%"));
                    }
                    if (graduation.getStudent() != null && !StringUtils.isEmpty(graduation.getStudent().getName())){
                        list.add(criteriaBuilder.like(student.get("name").as(String.class),"%" + graduation.getStudent().getName() + "%"));
                    }
    
                    if (graduation.getStudent() != null && !StringUtils.isEmpty(graduation.getStudent().getSex())){
                        list.add(criteriaBuilder.equal(student.get("sex").as(String.class),graduation.getStudent().getSex()));
                    }
    
                    if (graduation.getStudent() != null && !StringUtils.isEmpty(graduation.getStudent().getGraduation())){
                        list.add(criteriaBuilder.equal(student.get("graduation").as(String.class), graduation.getStudent().getGraduation() ));
                    }
    
                    if (!StringUtils.isEmpty(graduation.getCompany())){
                        list.add(criteriaBuilder.like(root.get("company"),"%" + graduation.getCompany()+ "%"));
                    }
    
                    if (!StringUtils.isEmpty(graduation.getIndustry())){
                        list.add(criteriaBuilder.like(root.get("industry"),"%" + graduation.getIndustry()+ "%"));
                    }
    
                    if (!StringUtils.isEmpty(graduation.getArea())){
                        list.add(criteriaBuilder.like(root.get("area"),"%" + graduation.getArea()+ "%"));
                    }
    
                    if (!StringUtils.isEmpty(graduation.getSalary())){
                        list.add(criteriaBuilder.equal(root.get("salary"),graduation.getSalary()));
                    }
    
                    if (!StringUtils.isEmpty(graduation.getHasInsuranceAndHousingFund())){
                        list.add(criteriaBuilder.equal(root.get("hasInsuranceAndHousingFund"),graduation.getHasInsuranceAndHousingFund()));
                    }
    
                    return criteriaBuilder.and(list.toArray(new Predicate[list.size()]));
                }
            },pageable);
        }
    

      参考:https://blog.csdn.net/qq_36289377/article/details/80761103

  • 相关阅读:
    表的转置 行转列: DECODE(Oracle) 和 CASE WHEN 的异同点
    Sql中EXISTS与IN的使用及效率
    Oracle学习之start with...connect by子句的用法
    Java复制、移动和删除文件
    简单的实现微信获取openid
    SQL语句中LEFT JOIN、JOIN、INNER JOIN、RIGHT JOIN的区别?
    java 基础最全网站
    SpringBoot(十一)过滤器和拦截器
    做项目遇到的问题集锦
    使用Java实现二叉树的添加,删除,获取以及遍历
  • 原文地址:https://www.cnblogs.com/blog411032/p/10828859.html
Copyright © 2011-2022 走看看