簡體   English   中英

Hibernate left join fetch on many returns 口是心非

[英]Hibernate left join fetch on many returns duplicities

我有一個問題,我通過 Spring 數據使用 Hibernate,我有這個數據 model(模型要大得多,但這是導致問題的部分)。

假設我們有Entity AEntity B 兩個實體之間的關系是多對多的

我正在嘗試獲取帶有B記錄的A記錄(以防止延遲加載)。

model是這樣連接的

在實體 A 上:

@ManyToMany(mappedBy = "items")
private List<BEntity> bs = new ArrayList<>();

在實體 B 上

@ManyToMany
@JoinTable(
        name = "a_b",
        joinColumns = { @JoinColumn(name = "b_id", referencedColumnName = "id") },
        inverseJoinColumns = { @JoinColumn(name = "a_id", referencedColumnName = "id") }
)
private Collection<AEntity> as = new ArrayList<>();

所以它是典型的 M:N 關系。 我正在嘗試檢索 A 數據,如下所示

@Query("SELECT a FROM AEntity a " +
        "   LEFT JOIN FETCH a.bs" +
        "WHERE a.id IN (:aIds)")
List<AEntity> findX(@NonNull @Param("aIds") Collection<Long> aIds);

結果 SQL 類似於

select X -- select fields omitted for simplicity
from item itembo0_
         left outer join a_b ab on a.id = ab.a_id
         left outer join b b on ab.b_id = b.id
where a.id in (...)

這是我所期望的。 SQL 將導致重復(我也希望如此,因為可能有許多 B 記錄,每個記錄都有一個結果行)。 但最后, hibernate 並沒有將所有這些行合並到一個 A entity with fetched B fields中。

例如,當我將 5 IDS 傳遞到“in”狀態時,我得到了 10 A 記錄。 每一個都有2條B記錄掛鈎! 那是奇怪的部分

有誰能告訴我為什么 hibernate 不通過 A.id 標識符合並這些 SQL 結果並生成重復項? 是因為我要的是 List 而不是 Set 嗎?

在查詢中使用“DISTINCT”關鍵字應該足以避免重復:

@Query("SELECT DISTINCT a FROM AEntity a " +
        "   LEFT JOIN FETCH a.bs" +
        "WHERE a.id IN (:aIds)")
List<AEntity> findX(@NonNull @Param("aIds") Collection<Long> aIds);

我不知道你存儲什么樣的數據,但正如你所提到的,也許更好的解決方案是使用 Set 而不是 List。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM