亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

FetchMode如何在Spring Data JPA中工作

FetchMode如何在Spring Data JPA中工作

冉冉說 2019-11-08 14:28:33
我確實在項目中的三個模型對象之間有關系(文章末尾的模型和存儲庫片段)。當我調用PlaceRepository.findById它時,會觸發三個選擇查詢:(“ sql”)SELECT * FROM place p where id = argSELECT * FROM user u where u.id = place.user.idSELECT * FROM city c LEFT OUTER JOIN state s on c.woj_id = s.id where c.id = place.city.id(對我而言)這是非常不正常的行為。據閱讀Hibernate文檔后所知,它應該始終使用JOIN查詢。在類中FetchType.LAZY更改為 查詢時(帶有附加SELECT 的查詢)沒有任何區別,而在類更改為 (使用JOIN查詢時)則沒有變化。FetchType.EAGERPlaceCityFetchType.LAZYFetchType.EAGER當我使用CityRepository.findById抑制射擊時,有兩個選擇:SELECT * FROM city c where id = argSELECT * 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}倉庫:PlaceRepositorypublic 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);}城市資料庫:public interface CityRepository extends JpaRepository<City, Long>, CityRepositoryCustom {        City findById(int id);}
查看完整描述

3 回答

?
動漫人物

TA貢獻1815條經驗 獲得超10個贊

我認為Spring Data會忽略FetchMode。在使用Spring Data時,我總是使用@NamedEntityGraph和@EntityGraph批注


@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);


}


查看完整回答
反對 回復 2019-11-08
?
不負相思意

TA貢獻1777條經驗 獲得超10個贊

首先,@Fetch(FetchMode.JOIN)并且@ManyToOne(fetch = FetchType.LAZY)是對立的,一個指示EAGER的獲取,而另一個則指示LAZY的獲取。


急切的獲取很少是一個好的選擇,對于可預期的行為,最好使用query-time JOIN FETCH指令:


public interface PlaceRepository extends JpaRepository<Place, Long>, PlaceRepositoryCustom {


    @Query(value = "SELECT p FROM Place p LEFT JOIN FETCH p.author LEFT JOIN FETCH p.city c LEFT JOIN FETCH c.state where p.id = :id")

    Place findById(@Param("id") int id);

}


public interface CityRepository extends JpaRepository<City, Long>, CityRepositoryCustom { 

    @Query(value = "SELECT c FROM City c LEFT JOIN FETCH c.state where c.id = :id")   

    City findById(@Param("id") int id);

}


查看完整回答
反對 回復 2019-11-08
  • 3 回答
  • 0 關注
  • 643 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號