熱心なフェッチを実行することを唯一の目的とするSpringDataSpecification(JPA述語を返す)を定義する方法はありますか?
遅延読み込みを使用してさまざまな関係を定義するエンティティがありますが、関連するすべてのコレクションを含むエンティティ表現全体を返したいクエリがいくつかありますが、これらのクエリの基準は異なる場合があります。フェッチグループの導入の可能性について説明している投稿をいくつか見ました(たとえば、春のフォーラムで)。これはおそらく理想的な解決策です。ただし、これはまだJPA仕様の一部ではないため、SpringDataはそれをサポートしていません。
さまざまな動的クエリで熱心なフェッチを実行するための再利用可能な方法を探しています。
たとえば、再利用可能な仕様を開発することを検討しました。この仕様の唯一の目的は、積極的な読み込みを実行することであり、他の仕様と組み合わせることができます。
private static Specification<MyEntity> eager() {
return new Specification<MyEntity>() {
@Override
public Predicate toPredicate(Root<MyEntity> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
for (PluralAttribute<? super MyEntity, ?, ?> fetch : root.getModel().getPluralAttributes()) {
root.fetch(fetch, JoinType.LEFT);
}
query.distinct(true);
return null;
}
};
}
この仕様の目的は、さまざまなクエリで再利用することです。
repository.findAll(where(eager()).and(otherCriteria).or(otherCriteria));
ただし、熱心なフェッチ仕様は真の述語ではないため、を返し、他の述語とチェーンするnull
と明らかな問題(つまり)を引き起こします。NullPointerExceptions
(この述語だけでも期待どおりに機能することに注意してください。つまり、次のクエリは適切にフェッチします:) repository.findAll(eager());
。
「熱心な」仕様から返すことができる適切な非null述語はありますか、またはSpring Data JPA仕様を使用して熱心なフェッチをトリガーするための他の再利用可能なアプローチがありますか(熱心な負荷を別の仕様に追加する必要はありません)?