JPA&x2B;HIBERNATE:多对多关系中的笛卡尔积

JPA&x2B;HIBERNATE:多对多关系中的笛卡尔积,jpa,many-to-many,jpql,cartesian-product,java-persistence-api,Jpa,Many To Many,Jpql,Cartesian Product,Java Persistence Api,我试图解释这个问题。我有一个有很多关系的实体 @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_EL

我试图解释这个问题。我有一个有很多关系的实体

@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;

...

}
当我尝试执行以下jpql查询时

SELECT  
    t  
FROM  
    Table1 t  
    LEFT JOIN FETCH t.elementOf 
WHERE  
    t.id = 55499
结果是一个包含两个元素(id为55499)的arraylist,每个元素都有一个包含两个元素(一个id为55498,一个id为55497)的arraylist。我想要得到的结果是一个元素(id为55499),其中arraylist包含两个元素(一个id为55498,一个id为55497)。
我希望我是清楚的。您能帮我优化java对象结果吗(我隐约记得eclipselink中的QueryHints.BATCH)?

您已经在查询中指定了
连接,这就是执行的操作。JPA提供程序不会自动删除重复项

您只需在查询中添加
distinct
,即可删除任何重复项:

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