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