@Slayred

JpaRepository: как убрать избыточный джойн в поиске при использовании entitygraph?

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

@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 - вызван он условием поиска. Или можно сказать что избыточен джойн, который идет в таблицу за данными, исходя из графа. Можете подсказать, пожалуйста, как избавится от этого джойна? мы ведь все равно исходя из графа идем за этим классом в эту таблицу. Может какой то параметр есть для этого или аннотация?
  • Вопрос задан
  • 101 просмотр
Пригласить эксперта
Ответы на вопрос 1
azerphoenix
@azerphoenix Куратор тега Spring
Java Software Engineer
Добрый день.
EntityGraph сам по себе ничего не делает. Это уже поднаготная самого Hibernate.
https://stackoverflow.com/questions/26769989/hiber...

Может какой то параметр есть для этого или аннотация?

Такого параметра нет.

Вот, полезная статья по этой теме - https://thorben-janssen.com/5-common-hibernate-mis...

Для поиска я бы рекомендовал использовать Specification<T> & Criteria API. А на больших проектах тут уже использовать Hibernate Search, ElasticSearch, Apache Lucene
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы