2016-10-04 71 views
0

我在SpringBoot中工作,我正在使用JPA存儲庫進行數據庫訪問。我有兩個實體說我們是否必須在SpringBoot中使用JPA時使用Left Join查詢?

Class A{ 
@Id 
private String primarykeyColumnA; 
@OneToMany(mappedBy="campaign",fetch = FetchType.EAGER,cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH }) 

private Set<B> b; 
.... 
} 

Class B{ 
@Id 
private Long primaryKeyColB; 

@ManyToOne(fetch = FetchType.LAZY, cascade = { CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.REMOVE }) 
@JoinColumn(name = "primarykeyColumnA") 
private A a; 
} 

所以我不得不加入這兩個表,這是一對多(爲一個A,會有很多B)的關係。它工作正常。但我想確保使用Left join。通常是左連接還是應該專門使用查詢?

一些幫助是非常感謝。

回答

2

我認爲這取決於您使用的JPA提供程序。在Hibernate的情況下,Hibernate不會執行你在加載一些A實體時所期待的內容。

相反下列步驟將被執行:

  • 執行SQL查詢來加載甲實體,而不加載乙實體。
  • 對於每個實體,執行SQL查詢以加載其相關的B實體。

如果B實體不在緩存中,您將遇到1 + n查詢問題。

如果要使用單個SQL查詢加載包含相關B實體的A實體,則必須使用聯合提取子句(左視圖,內視視圖,根據您的情況)進行查詢。

+0

感謝您的回答。我正在使用Hibernate。我不明白你提到的1 + n查詢問題。我擔心的是,如果沒有B與特定的A相關聯,那麼在內連接的情況下,我不會得到任何結果,因爲對應的A沒有B值。 – saru10

+0

1 + n問題意味着,當您對A實體執行JPA查詢時,Hibernate將創建1個SQL查詢以加載A個實體,然後n個SQL查詢爲以前加載的每個A實體加載B個實體。在這種情況下,如果沒有任何B實體與A相關,則不會有問題。 –