0

我嘗試解釋這個問題。我有多對多關係的實體JPA + HIBERNATE:多對多關係中的笛卡爾積

@Entity 
@Table(name="TABLE1") 
public class Table1 implements Serializable { 

... 

//bi-directional many-to-many association to Table1 
@ManyToMany 
@JoinTable(
    name="TABLE2" 
    , joinColumns={ 
     @JoinColumn(name="ID_ELEMENTS1") 
     } 
    , inverseJoinColumns={ 
     @JoinColumn(name="ID_ELEMENTS2") 
     } 
    ) 
private List<Table1> elements; 

//bi-directional many-to-many association to Table1 
@ManyToMany(mappedBy="elements") 
private List<Table1> elementOf; 

... 

} 

db表如下:

TABLE1 
ID  ... 
55499 ... 
55498 ... 
55497 ... 

TABLE2 
ID_ELEMENTS1 ID_ELEMENTS2 
55499   55498 
55499   55497 

當我嘗試執行以下JPQL查詢

SELECT 
    t 
FROM 
    Table1 t 
    LEFT JOIN FETCH t.elementOf 
WHERE 
    t.id = 55499 

結果與元素的數組列表( ID爲55499),每個元素都有一個包含兩個元素的數組列表(一個ID爲55498,另一個ID爲55497)。我想要得到的結果是一個元素(ID爲55499)與兩個元素的數組列表(一個ID爲55498,另一個ID爲55497)。 我希望我很清楚。你能幫我優化java對象結果嗎(我依稀記得eclipselink中的QueryHints.BATCH)?

回答

1

您在查詢中指定了join,這就是執行的內容。 JPA提供程序不會自動刪除重複項。

您只需在查詢中添加distinct刪除任何重複:

SELECT 
    DISTINCT t 
FROM 
    Table1 t 
    LEFT JOIN FETCH t.elementOf 
WHERE 
    t.id = 55499 
+0

我愛你!!!!! – Fra83