2016-12-07 60 views
0

我正在使用條件來選擇具有引用其他表的字段的實體列表,所以我使用了別名。問題是,當我嘗試訪問連接字段時,hibernate執行另一個select到數據庫。這實際上是無效的,因爲這是爲每個結果行執行一個查詢。訪問連接字段的休眠標準

誰能告訴我爲什麼會發生這種情況?的標準

使用(減少到只有相關線路)

List<Country> list = session.createCriteria(Country.class) 
    .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY) 
    .createAlias("locations", "location") 
    .list(); 

for (Countries cntry : list){ 
    cntry.getLocations().size(); // here hibernate execute another query 
} 

國家(的重要部分)

@Entity 
public class Country { 

    // other fields as uuid etc. 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "country") 
    private List<Location> locations; 

    // getters and setters 
} 

位置(的重要部分)

@Entity 
public class Location { 

    // other fields as uuid etc. 

     @ManyToOne(fetch = FetchType.LAZY) 
     @JoinColumn(name = "COUNTRY_UUID") 
     private Country country; 

    // getters and setters 
} 

回答

1

嘗試:

List<Country> list = session.createCriteria(Country.class) 
    .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY) 
    .setFetchMode("locations", FetchMode.JOIN) 
    .createAlias("locations", "location") 
    .list(); 

這將導致在獲取所有的國家和地點的單一查詢。

除此之外,您應該在位置擁有@BatchSize。如果您沒有設置獲取模式,則@BatchSize(size = 20)將爲每20個關係導致1個語句。

+0

查詢已加入所有連接表的所有字段,但看起來這些字段未設置。設置獲取模式並沒有幫助:( – cici

+1

你的問題肯定與你的獲取模式有關。你使用的是什麼版本的hibernate?舊版本可能需要FetchMode.EAGER。 – teacurran