Есть три класса:
@Entity
@Table(name = "first")
@NamedEntityGraph(name = "Graph", attributeNodes = {@NamedAttributeNode(value = "second", subgraph = "Graph.Sub")},
subgraphs = {
@NamedSubgraph(name = "Graph.Sub", attributeNodes = @NamedAttributeNode(value = "third"))
})
public class First {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;
@Column(name = "name")
private String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "second")
@ToString.Exclude
private Second second;
}
@Entity
@Table(name = "second")
public class Second {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;
@Column(name = "name")
private String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "third")
@ToString.Exclude
private Third third;
}
@Entity
@Table(name = "third")
public class Third {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;
@Column(name = "name")
private String name;
}
и есть метод JpaRepository, который осуществляет поиск по одному из полей первого класса, которое также является классом
public interface FirstRepository extends JpaRepository<First, Long> {
@EntityGraph(value = "Graph")
List<First> findBySecond_Name(String name);
}
На выходе, генерится такой запрос:
Hibernate:
select
f1_0.id,
f1_0.name,
s2_0.id,
s2_0.name,
t1_0.id,
t1_0.name
from
first f1_0
left join
second s1_0
on s1_0.id=f1_0.second
left join
second s2_0
on s2_0.id=f1_0.second
left join
third t1_0
on t1_0.id=s2_0.third
where
s1_0.name=?
В результате, получается один избыточный джойн на таблицу second - вызван он условием поиска. Или можно сказать что избыточен джойн, который идет в таблицу за данными, исходя из графа. Можете подсказать, пожалуйста, как избавится от этого джойна? мы ведь все равно исходя из графа идем за этим классом в эту таблицу. Может какой то параметр есть для этого или аннотация?