Spring JPA - есть ли хороший способ внутреннего соединения между объектами или единственный способ - это JPQL? - PullRequest
0 голосов
/ 12 июля 2020

У меня есть следующие сущности:

@Entity
public class Organisation {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    // ...
}

@Entity
public class Section{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    // ...
    @ManyToOne
    @JoinColumn(name = "organisation_id", nullable = false)
    private Organisation organisation;
}

@Entity
public class SubSection {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    // ...
    @ManyToOne
    @JoinColumn(name = "section_id")
    private Section section;
}

Теперь я хочу найти все SubSections по Organisation Id. Прямо сейчас я делаю это, используя JPQL в SubSectionRepository, как указано выше:

public interface SubSectionRepository extends JpaRepository<SubSection, Long>{

@Query(value = "SELECT ss.* FROM sub_section as ss INNER JOIN section as s ON ss.section_id = s.id WHERE s.organisation_id = ?1", nativeQuery = true)
List<SubSection> findByOrganisation(Long organisationId);
    
}

Есть ли способ, которым я могу сделать INNER JOIN с помощью интерфейса JpaRepository?

Ответы [ 2 ]

2 голосов
/ 12 июля 2020
  • Обновите свой метод до
public interface SubSectionRepository extends JpaRepository<SubSection, Long>  {

    List<SubSection> findBySectionOrganisationId(Long organisationId);
}
  • Hibernate будет сгенерировать что-то вроде этого.
    select subsec.*,
    from sub_section subsec 
    left outer join section sec on subsection.section_id=sec.id 
    left outer join organisation org on section.organisation_id=org.id 
    where org.id=?
  • Не беспокойтесь о члене left join. На самом деле это inner join, потому что у вас есть условие where с id = в самой правой таблице. Из-за этого он фактически становится inner join. Т.е. если для этой записи в правой таблице нет записи, она будет проигнорирована.
2 голосов
/ 12 июля 2020

А ты так пробовал

subsectionRepository.findBySectionOrganizationId(long organizationId)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...