JPA+HIBERNATE: декартово произведение в отношениях "многие ко многим"

Я пытаюсь объяснить проблему. У меня есть сущность с отношениями ManyToMany

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

...

}

БД таблицы:

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

В результате получается массив с двумя элементами (с идентификатором 55499), и каждый элемент имеет список из двух элементов (один с идентификатором 55498 и один с идентификатором 55497). В результате я хотел бы получить один элемент (с идентификатором 55499) с массивом из двух элементов (один с идентификатором 55498 и один с идентификатором 55497). Надеюсь, мне было ясно. Можете ли вы помочь мне оптимизировать результат объекта Java (я смутно помню QueryHints.BATCH в eclipselink)?

1 ответ

Решение

Вы указали join в запросе это то, что выполняется. JPA провайдер не будет удалять дубликаты автоматически.

Вы можете просто добавить distinct в запросе удалить все дубликаты:

SELECT  
    DISTINCT t  
FROM  
    Table1 t  
    LEFT JOIN FETCH t.elementOf 
WHERE  
    t.id = 55499
Другие вопросы по тегам