我们的应用程序中有以下层次结构:
@MappedSuperclass
public abstract class AbstractDemandOrMeasureBE {
}
@Entity
@Inheritance
@DiscriminatorColumn(name = "DISCRIMINATOR", discriminatorType = DiscriminatorType.INTEGER)
@Table(name = "V_VIEW2")
public abstract class AbstractDemandOrConcreteMeasureBE extends AbstractDemandOrMeasureBE {
@Column(name = "VC_ID")
private Long vcId;
}
@Entity
@DiscriminatorValue("2")
public class MinimalDemandBE extends AbstractDemandOrConcreteMeasureBE {
..
}
@Entity
@DiscriminatorValue("1")
@HasRelationsAnnotatedAsLazyLoaded
public class ValidationMeasureBE extends AbstractDemandOrConcreteMeasureBE {
..
}
在其他对象中,我试图加载这样的实体:
@Table(name = "V_VIEW2")
public class VCBE extends SomeVeryAbstractBE {
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "VC_ID")
private List<ValidationMeasureBE> validationMeasures;
public transient static final String ATTRIBUTE_VALIDATION_MEASURES = "validationMeasures";
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "VC_ID")
private List<MinimalDemandBE> minimalDemands;
public transient static final String ATTRIBUTE_MINIMAL_DEMANDS = "minimalDemands";
有一个预编译查询来加载所有层次结构,这些层次结构加载一些其他父对象。还有一个查询提示——eclipselink.left-join-fetch=PP.VCBE.validationMeasures(如果改为eclipselink.left-join-fetch=PP.VCBE.minimalDemands,则加载最小需求,但验证措施(具有鉴别器 1 的条目)也被加载到最小需求集合中 - 但不应加载那些)。
现在,执行查询时,validationMeasures 集合是否填充了对象,但所有这些对象实际上都是最低要求,并且在数据库中具有 2 作为鉴别器值。
执行的查询如下:
SELECT * FROM V_VIEW1 t1
LEFT OUTER JOIN V_VIEW0 t0 ON (t0.PP_D = t1.ID)
LEFT OUTER JOIN V_VIEW2 t2 ON (t2.VC_ID = t0.ID)
WHERE (((t1.ID = ?) AND (t1.HP_ID = ?))
AND t1.HP_IS IN (SELECT t3.ID FROM V_VIEW t3 WHERE (t3.HWPG_ID = ?)))
bind => [3 parameters bound]
正如我所见,查询中没有 DISCRIMINATOR 约束,为什么?
对这种行为有任何想法吗?以及如何根据鉴别器值告诉 eclipselink 加载集合?