1

アプリケーションには次の階層があります。

@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に指示するにはどうすればよいですか?

4

1 に答える 1

0

この SQL を取得するために使用する JPQL クエリとヒントを含めることができますか。

つまり、join-fetch を使用すると機能するが、left-join-fetch を使用しない場合に機能するとおっしゃっていますか?

外部結合を使用するときに継承識別子式が含まれていないのは、バグの可能性があるようです。その場合は、バグを記録して投票してください。

あなたのモデルは非常に奇妙です。2 つのサブクラスを 2 つの別個の関係に分割するのはなぜですか? 1つ持っていると、はるかに効率的になります。または、それらを分割する場合は、同じ外部キーではなく、異なる外部キーを使用する必要があります。2 つの異なるリレーションシップで同じ外部キーを共有することは、おそらく良い考えではありません。

于 2011-12-20T15:53:48.577 に答える