2013-06-18 60 views
1

我正在使用使用Hibernate 4作爲提供程序的JPA 2 CriteriaBuilder構建查詢。我一直在玩FetchModes,並得出結論認爲SELECT是我需要的。但SELECT力啓用FetchType.LAZY。我在某個地方讀到這個,似乎是這樣。FetchType EAGER與Root fetch()不一樣嗎?

在設備類此配置產生正確的結果:

@Fetch(value=FetchMode.SELECT) 
@OneToMany(fetch=FetchType.EAGER, mappedBy = "device") 
public List<DevInterfaces> getDevInterfaces() { 
    return this.devInterfaces; 
} 

但是我不想FetchType = EAGER硬編碼在我的實體。我希望在獲取時控制,我想我可以用一個取()這樣做:

CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<Devices> dq = cb.createQuery(Devices.class); 
Root<Devices> dev = dq.from(Devices.class); 
dev.fetch(Devices_.devInterfaces) 

但結果是內連接,我不希望出現這種情況。

如何在沒有硬編碼FetchType.EAGER的情況下使用FetchMode.SELECT獲取?

回答

1

如上所述,並且也記錄爲here,fetch使用內連接。

dev.fetch(Devices_.devInterfaces, JoinType.LEFT) 

加入類型可以使用重載時取方法,該方法還需要JoinType作爲參數來指定