如何优化休眠多态查询以不加入所有子类

Ser*_*rov 6 java optimization hibernate polymorphic-associations

我正在尝试优化休眠查询,并遇到了休眠使查询比我预期的更复杂的问题。

我有一个基类WorkUnit和几个子类CheckEmployee,Meeting,HomeCareRequestWorkUnitAssignment指向WorkUnit

这是课程的草图:

@Entity
@Table(name = "WORK_UNIT_ASSIGNMENT")
public class WorkUnitAssignmentEntity {
    private WorkUnitEntity workUnit;
    ...

    @ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
    @JoinColumn(name = "WORK_UNIT_A_WORK_UNIT_ID")
    public WorkUnitEntity getWorkUnit() {
        return workUnit;
    }
}

@Entity
@Table(name = "WORK_UNIT")
@Inheritance(strategy = InheritanceType.JOINED)
public class WorkUnitEntity  {
}

@Entity
@Table(name = "CHECK_EMPLOYEE")
@PrimaryKeyJoinColumn(name="CHECK_EMPLOYEE_ID")
public class CheckEmployee extends WorkUnitEntity {
}

@Entity
@Table(name = "MEETING")
@PrimaryKeyJoinColumn(name = "MEETING_ID")
public class MeetingEntity extends WorkUnitEntity {
}

@Entity
@Table(name = "HCIS_HC_REQUEST")
@PrimaryKeyJoinColumn(name = "HC_REQUEST_ID")
public class HomeCareRequestEntity extends WorkUnitEntity {
}
Run Code Online (Sandbox Code Playgroud)

我想加载WorkUnitAssignmentHomeCareRequest只。这是我的查询:

DetachedCriteria criteria = DetachedCriteria.forClass(WorkUnitAssignmentEntity.class);
DetachedCriteria dc = criteria.createCriteria("workunit", "workunit");
dc.add(Restrictions.eq("workunit.class", HomeCareRequestEntity.class));
Run Code Online (Sandbox Code Playgroud)

Hibernate生成这样的sql:

select ... from WORK_UNIT_ASSIGNMENT this_, WORK_UNIT joinworkun1_, 
           HC_REQUEST joinworkun1_1_, CHECK_EMPLOYEE joinworkun1_2_, 
           MEETING joinworkun1_3_
where this_.WORK_UNIT_A_WORK_UNIT_ID=joinworkun1_.WORK_UNIT_ID and 
joinworkun1_.WORK_UNIT_ID=joinworkun1_1_.HC_REQUEST_ID(+) and 
joinworkun1_.WORK_UNIT_ID=joinworkun1_2_.CHECK_EMPLOYEE_ID(+) and 
joinworkun1_.WORK_UNIT_ID=joinworkun1_3_.MEETING_ID(+) and 
case
when joinworkun1_1_.HC_REQUEST_ID is not null then 1
when joinworkun1_2_.CHECK_EMPLOYEE_ID is not null then 2
when joinworkun1_3_.MEETING_ID is not null then 3
when joinworkun1_.WORK_UNIT_ID is not null then 0
end=?
Run Code Online (Sandbox Code Playgroud)

此查询必须额外连接CHECK_EMPLOYEEMEETING。我的问题是如何配置休眠而不进行这些连接。

我试图将继承更改为singe表,并在子类中使用辅助表,但结果是相同的。