私は次のクラスを持っています:
@Entity
@Table(name = "base")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DISCRIMINATOR", discriminatorType = DiscriminatorType.STRING)
@ForceDiscriminator
public class Base {
// ...
}
@Entity
@DiscriminatorValue("foo")
public class Foo extends Base {
@OneToMany( mappedBy = "foo", cascade=CascadeType.ALL )
private List<Bar> bars = new ArrayList<Bar>();
// ...
}
@Entity
public class Bar {
@ManyToOne (optional = false)
@JoinColumn(name = "foo_id" )
private Foo foo;
@OneToOne
@JoinColumn(name = "baz_id", nullable = false)
private Baz baz;
//...
}
@Entity
public class Baz {
// ...
}
今、私は基本的にすべてをロードしたいのですBase
が、該当する場合は熱心なロードバーなので、次のクエリを使用します。
SELECT b FROM Base b LEFT JOIN FETCH b.bars
これは機能しますが、Barエンティティに対してSELECT N+1の問題が発生するようです。
Hibernate: /* SELECT b FROM Base b LEFT JOIN FETCH b.bars */ SELECT ...
Hibernate: /* load com.company.domain.Baz */ SELECT ...
Hibernate: /* load com.company.domain.Baz */ SELECT ...
N + 1 SELECTを使用せずに、子コレクション内の各要素の関連付けを熱心にロードするように休止状態に指示することは可能ですか?
私は次のクエリの行に沿って何かを試しましたが、コレクションなので明らかに機能しません:
SELECT b FROM Base b LEFT JOIN FETCH b.bars LEFT JOIN FETCH b.bars.baz
//Results in: illegal attempt to dereference collection [Foo.id.bars] with element property reference [baz]
またIN(b.bars) bars
、を使用してみましたが、これにより子コレクションを参照できますが、私の目標であるbarsコレクションを熱心にロードしていないようです。
私はそれを理解できないように見えるので、なぜこれが起こるのかについての説明もいいでしょう。