JpaRepository: Избыточный джойн при поиске по одному из полю

Рейтинг: 2Ответов: 0Опубликовано: 23.08.2023

Есть три класса:

@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 - вызван он условием поиска. Или можно сказать что избыточен джойн, который идет в таблицу за данными, исходя из графа. Можете подсказать, пожалуйста, как избавится от этого джойна? мы ведь все равно исходя из графа идем за этим классом в эту таблицу. Может какой то параметр есть для этого или аннотация?

Ответы

Ответов пока нет.