Граф сущностей на множественных объектах загрузки отношений многократно - Spring Data JPA - PullRequest
0 голосов
/ 31 января 2019

У меня есть отношения @ManyToMany между двумя моими сущностями.Когда я пытаюсь загрузить родителей своими детьми, родители повторяют в ответе полезную нагрузку.Я хочу решить мою проблему с EntityGraphs.

Вот родитель с аннотацией.

@Entity
@Table(name="Parent_table")
@NamedEntityGraph(
    name = "Parent.children",
    attributeNodes = @NamedAttributeNode("children"))

public class Parent implements Serializable{

//some extra code

@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(
        name="join table", joinColumns=@JoinColumn(name="key"),inverseJoinColumns=@JoinColumn(name="key"))
private List<Child> children;

Вот код в хранилище для родителя.

    @EntityGraph(value = "Parent.children", type = EntityGraphType.LOAD)
public List<Parent> findAll(Predicate predicate);

У меня много-много отношений между двумя моими сущностями.Но я хочу получить результат как

parent1 {
child1,
child2
}

Но я получаю родителей для каждой комбинации ..

Parent1 {
child1,
child2
}

Parent1 {
child1,
child2
}

там я получаю parent2.

Но что я хочучтобы получить parent1 только один раз, не повторяя.При использовании графа сущностей.

1 Ответ

0 голосов
/ 31 января 2019

Если вы используете граф сущностей , Hibernate объединяет родительскую и дочернюю таблицы в запросе.Это создает продукт в наборе результатов, и вы получаете ссылку на родительский объект для каждого из его дочерних элементов.

Вы можете исправить это, используя ключевое слово DISTINCT в своем запросе.С помощью Spring Data JPA вы можете сделать это двумя способами:

  1. Вы можете изменить имя метода с findAll на findAllDistinctBy.
  2. Вы можете определить свой собственный запрос, используя @Query("SELECT DISTINCT p FROM parent p")

Hibernate включит ключевое слово DISTINCT в ваш запрос SQL.Этого можно избежать, установив подсказку QueryHints.HINT_PASS_DISTINCT_THROUGH в false.

...