首页 > 解决方案 > EclipseLink JPA 与 N+1 @OneToMany 和 @OneToOne 关系与多级实体

问题描述

我必须根据 departmentId 和以下条件获取详细信息。我正在使用eclipseLink JPA 2.4+

if IS_SUBJECT = 2 Teacher entity should join with Subject
if IS_SUBJECT = 1 Teacher entity should join with Lab

当我使用 departmentId 获取值时,应该映射到 Department 和 Teacher 实体。JPA 查询如下。

SELECT distinct f FROM Department f " +
    " join fetch f.teacherList fm" +
    " join fetch fm.subject fmi on (f.isSubject = 2 and fm.subjectId = fmi.subjectId) " +
    " join fetch fm.lab fmg on (f.isSubject = 1 and fm.labId = fmg.labId) " +
    " WHERE f.departmentId IN :departmentIdList".

实体如下:

@Entity
public class Department{
    @Id
    @Column(name = "DEPARTMENT_ID")
    private Integer departmentId;

    @OneToMany(mappedBy = "department")
    private List<Teacher> teacherList;

    @Column(name="IS_SUBJECT")
    private isSubject;
}

@Entity
public class Teacher{
    @Id
    @Column(name = "TEACHER_ID")
    private Integer teacherId;

    @Column(name = "DEPARTMENT_ID")
    private Integer departmentId;

    @Column(name = "SUBJECT_ID")
    private Integer subjectId;

    @Column(name = "LAB_ID")
    private Integer labId;

    @ManyToOne
    @JoinColumn(name = "DEPARTMENT_ID", insertable = false, updatable = false)
    @BatchFetch(BatchFetchType.JOIN)
    private Department department;

    @JoinColumn(name = "SUBJECT_ID", insertable = false, updatable = false)
    @BatchFetch(BatchFetchType.JOIN)
    private Subject subject;

    @BatchFetch(BatchFetchType.JOIN)
    @JoinColumn(name = "LAB_ID", insertable = false, updatable = false)
    private Lab lab;

}

@Entity
public class Subject{
    @Id
    @Column(name = "SUBJECT_ID")
    private Integer subjectId;

    @Column(name = "SUBJECT_NAME")
    private Integer subjectName;

}

@Entity
public class Lab{
    @Id
    @Column(name = "LAB_ID")
    private Integer labId;

    @Column(name = "LAB_NAME")
    private Integer labName;

}

生成的查询需要很长时间才能从 eclipse 链接 JPA 中获取。请帮助我编写查询。

标签: hibernatespring-bootjpaspring-data-jpaeclipselink

解决方案


推荐阅读