2016-03-04 14 views
0

我試圖瞭解EclipseLink行爲的情況下,如果我使用本機查詢。所以,我有實體是這樣的:EclipseLink本機查詢和FetchType行爲

class Entity { 

    @OneToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name="other_entity_id") 
    private OtherEntity otherEntity; 

    @Column(name = "name") 
    private String name; 
    //gets ... sets ... 
} 

和相應的表是這樣的:

**ENTITY** 

INTEGER ID; 

VARCHAR NAME; 

OTHER_ENTITY_ID; 

然後我運行本地查詢

Query query = getEntityManager().runNativeQuery("select * from ENTITY", Entity.class); 
query.getResultList() 

Entity我宣佈OtherEntity otherEntity其中標註有FetchType.LAZY,但是我的查詢選擇(*) - 所有列,包括OTHER_ENTITY_ID。問題是 - 如果我運行提取所有列的本機查詢,是否填充了FetchType.LAZY註釋的字段,就好像它們是FetchType.EAGER或不是?我從來沒有與EclipseLink的工作前,tyring決定使用它是否值得或不那麼我會很感激的任何幫助

謝謝,乾杯

回答

0

我的第一個建議是開啓的EclipseLink的SQL日誌記錄,並執行等價的JPQL來加載您正在查找的內容,並查看EclipseLink生成的SQL來完成此操作,以瞭解基於當前映射在本機查詢中構建對象所需的內容。

關係通常使用從外鍵讀入的值加載輔助查詢,因此急切或懶惰的讀取不受本機查詢讀入「實體」的影響 - 查詢需要other_entity_id值而不管讀取類型。當需要基於加載/延遲加載時,EclipseLink將發出映射所需的查詢。

您可以通過標記關係將使用joining來更改此項。在這種情況下,EclipseLink將不僅期望實體值位於查詢中,而且還引用OtherEntity值。

相關問題