[解決済み] Spring Data JPAにおけるFetchModeの動作について
2022-10-31 01:09:58
質問
私のプロジェクトでは、3つのモデルオブジェクトの間に関係があります(投稿の最後にあるモデルとリポジトリのスニペット。
私が
PlaceRepository.findById
を呼び出すと、3つのセレクトクエリが実行されます。
("sql")
-
SELECT * FROM place p where id = arg
-
SELECT * FROM user u where u.id = place.user.id
-
SELECT * FROM city c LEFT OUTER JOIN state s on c.woj_id = s.id where c.id = place.city.id
それは(私にとっては)かなり珍しい動作です。Hibernateのドキュメントを読んだ限りでは、常にJOINクエリを使用するはずです。クエリに違いはありません。
FetchType.LAZY
が
FetchType.EAGER
で
Place
クラス(SELECT を追加したクエリ)でも、同じように
City
クラスの場合
FetchType.LAZY
に変更されました。
FetchType.EAGER
(に変更されます(JOINを使ったクエリ)。
私が
CityRepository.findById
を抑えると、2つのselectが発生します。
-
SELECT * FROM city c where id = arg
-
SELECT * FROM state s where id = city.state.id
私の目標は、すべての状況で同じ動作をすることです (常に JOIN または SELECT、ただし JOIN が望ましい)。
モデルの定義です。
場所
@Entity
@Table(name = "place")
public class Place extends Identified {
@Fetch(FetchMode.JOIN)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id_user_author")
private User author;
@Fetch(FetchMode.JOIN)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "area_city_id")
private City city;
//getters and setters
}
都市
@Entity
@Table(name = "area_city")
public class City extends Identified {
@Fetch(FetchMode.JOIN)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "area_woj_id")
private State state;
//getters and setters
}
リポジトリです。
プレイスレポジトリ
public interface PlaceRepository extends JpaRepository<Place, Long>, PlaceRepositoryCustom {
Place findById(int id);
}
UserRepositoryです。
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findAll();
User findById(int id);
}
CityRepositoryです。
public interface CityRepository extends JpaRepository<City, Long>, CityRepositoryCustom {
City findById(int id);
}
どのように解決するのですか?
Spring DataはFetchModeを無視していると思うのですが。私はいつも
@NamedEntityGraph
と
@EntityGraph
アノテーションは、Spring Dataを扱う際に
@Entity
@NamedEntityGraph(name = "GroupInfo.detail",
attributeNodes = @NamedAttributeNode("members"))
public class GroupInfo {
// default fetch mode is lazy.
@ManyToMany
List<GroupMember> members = new ArrayList<GroupMember>();
…
}
@Repository
public interface GroupRepository extends CrudRepository<GroupInfo, String> {
@EntityGraph(value = "GroupInfo.detail", type = EntityGraphType.LOAD)
GroupInfo getByGroupName(String name);
}
ドキュメントを確認する ここで
関連
-
[解決済み] Spring Data JPAにおけるCrudRepositoryとJpaRepositoryのインターフェースの違いは何ですか?
-
ApplicationContextの起動エラーです。条件レポートを表示するには、アプリケーションを'de'で再実行します。
-
StringBuilderが投げるArrayIndexOutOfBoundsExceptionの探索
-
Javaがリソースリークに遭遇した:'input'が閉じない 解決方法
-
[解決済み] Javaの「for each」ループはどのように機能するのですか?
-
[解決済み] Spring Bootアプリケーションにポートを設定する方法
-
[解決済み] Hibernateの「オブジェクトは保存されていないトランジェントインスタンスを参照しています - フラッシュする前にトランジェントインスタンスを保存してください」エラーの修正方法
-
[解決済み] Springのオートワイヤリングの仕組みは?
-
[解決済み】HibernateとSpring Data JPAの違いは何ですか?
-
[解決済み] Spring-data-jpaを使用してエンティティを更新するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
プロジェクトの依存関係を解決できない。
-
Solve モジュールのビルドに失敗しました。Error: ENOENT: no such file or directory エラー
-
Javaクラスが "Error occurred during initialization of boot layer "というエラーで実行される。
-
Junitのユニットテストはjava.lang.Testを報告します。
-
配列定数は初期化子でのみ使用可能です。
-
eclipse にリソースリーク:'in' が閉じない
-
コンストラクタDate()が未定義である問題
-
Javaがエラーで実行される、選択が起動できない、最近起動したものがない
-
Java Runtime Environmentを継続するためのメモリが不足しています。
-
linux ant Resolve error: main class not found or couldn't be loaded org.apache.tools.ant.launcher.