次のドメインモデルを前提Answer
として、Value
sとそれぞれのサブ子を含むすべてのをロードし、それをに入れてAnswerDTO
JSONに変換したいと思います。私は実用的な解決策を持っていますが、アドホックを使用して取り除く必要があるN + 1の問題に悩まされています@EntityGraph
。すべての関連付けが構成されますLAZY
。
@Query("SELECT a FROM Answer a")
@EntityGraph(attributePaths = {"value"})
public List<Answer> findAll();
アドホック使用@EntityGraph
上のRepository
方法私は値が上にN + 1を防止するために、プリフェッチされることを保証することができるAnswer->Value
関連付けを。私の結果は問題ありませんselected
が、MCValue
sの関連付けの遅延読み込みのため、別のN + 1問題があります。
これを使う
@EntityGraph(attributePaths = {"value.selected"})
selected
もちろん、フィールドは一部のValue
エンティティの一部にすぎないためです。
Unable to locate Attribute with the the given name [selected] on this ManagedType [x.model.Value];
selected
値がaの場合にのみ、関連付けをフェッチしようとするようJPAに指示するにはどうすればよいMCValue
ですか?のようなものが必要ですoptionalAttributePaths
。
selected
を含む回答を取得するためのクエリですMCValue
。これには追加のループが必要であり、データセット間のマッピングを管理する必要があるのが嫌いでした。私はこれのためにHibernateキャッシュを活用するあなたの考えが好きです。結果を格納するためにキャッシュに依存することは(一貫性の観点から)どの程度安全かについて詳しく説明できますか?これは、クエリがトランザクションで行われたときに機能しますか?私は見つけるのが難しく、散発的な遅延初期化エラーを恐れています。