プロジェクトの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クエリを使用する必要があります。クラス(SELECTを追加したクエリ)にFetchType.LAZY
変更し FetchType.EAGER
た場合のクエリに違いはありません。Place
クラス(JOINを使用したクエリ)City
にFetchType.LAZY
変更した 場合も同様ですFetchType.EAGER
。
CityRepository.findById
火の抑制を使用すると、2つの選択が行われます。
SELECT * FROM city c where id = arg
SELECT * FROM state s where id = city.state.id
私の目標は、すべての状況でsam動作を使用することです(常に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
}
リポジトリ:
PlaceRepository
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);
}