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

  • 相关阅读:
    祝师傅新婚快乐 :)
    NetBeans IDE 6.8 里程碑 2 已经可用!
    GRETA库在VS 2005环境下的编译经验
    祝师傅新婚快乐 :)
    NetBeans 时事通讯(刊号 # 74 Sep 30, 2009)
    忆父亲
    NetBeans 时事通讯(刊号 # 74 Sep 30, 2009)
    Miss Nev great app
    订阅我不会怀孕
    数据结构排序: 两路归并排序算法 子逸 博客园
  • 原文地址:https://www.cnblogs.com/blog411032/p/10828859.html
Copyright © 2011-2022 走看看