Я создал двунаправленную связь OneToOne между двумя сущностями Review и Reviewer. Рецензент является владельцем, а рецензия - обратной. Я заметил, что когда я вызывал метод findByBedrijfId () (тогда без пользовательского @Query), Hibernate запрашивал n + 1. Я надеялся, что этого не будет, если написать пользовательский @Query с помощью LEFT OUTER JOIN (см. ReviewRepository). Но вместо этого Hibernate по-прежнему запрашивает n + 1. Я читал о отложенной загрузке с отношением OneToOne, установив для параметра false значение false, как в этом сообщении: https://stackoverflow.com/a/47768154/3262578, но безуспешно. Так кто-нибудь знает, как я могу предотвратить это поведение.
2019-05-20 16:15:35.741 DEBUG 97403 --- [nio-8089-exec-1] org.hibernate.SQL : SELECT * FROM bedrijfreviews br LEFT OUTER JOIN reviewerinfo ri ON br.reviewid = ri.reviewid WHERE br.bedrijfId = ?
2019-05-20 16:15:35.770 DEBUG 97403 --- [nio-8089-exec-1] org.hibernate.SQL : select reviewer0_.reviewid as reviewid1_4_0_, reviewer0_.email as email2_4_0_, reviewer0_.leeftijdscategorie as leeftijd3_4_0_, reviewer0_.naam as naam4_4_0_, review1_.reviewid as reviewid1_0_1_, review1_.administratie as administ2_0_1_, review1_.bedrijfid as bedrijfi3_0_1_, review1_.commentaar as commenta4_0_1_, review1_.datum as datum5_0_1_, review1_.gemiddelde_cijfer as gemiddel6_0_1_, review1_.minpunten as minpunte7_0_1_, review1_.nakomen_afspraken as nakomen_8_0_1_, review1_.persoonlijke_benadering as persoonl9_0_1_, review1_.pluspunten as pluspun10_0_1_, review1_.reactiesnelheid as reactie11_0_1_, review1_.vakkennis as vakkenn12_0_1_ from reviewerinfo reviewer0_ left outer join bedrijfreviews review1_ on reviewer0_.reviewid=review1_.reviewid where reviewer0_.reviewid=?
2019-05-20 16:15:35.775 DEBUG 97403 --- [nio-8089-exec-1] org.hibernate.SQL : select reviewer0_.reviewid as reviewid1_4_0_, reviewer0_.email as email2_4_0_, reviewer0_.leeftijdscategorie as leeftijd3_4_0_, reviewer0_.naam as naam4_4_0_, review1_.reviewid as reviewid1_0_1_, review1_.administratie as administ2_0_1_, review1_.bedrijfid as bedrijfi3_0_1_, review1_.commentaar as commenta4_0_1_, review1_.datum as datum5_0_1_, review1_.gemiddelde_cijfer as gemiddel6_0_1_, review1_.minpunten as minpunte7_0_1_, review1_.nakomen_afspraken as nakomen_8_0_1_, review1_.persoonlijke_benadering as persoonl9_0_1_, review1_.pluspunten as pluspun10_0_1_, review1_.reactiesnelheid as reactie11_0_1_, review1_.vakkennis as vakkenn12_0_1_ from reviewerinfo reviewer0_ left outer join bedrijfreviews review1_ on reviewer0_.reviewid=review1_.reviewid where reviewer0_.reviewid=?
2019-05-20 16:15:35.777 DEBUG 97403 --- [nio-8089-exec-1] org.hibernate.SQL : select reviewer0_.reviewid as reviewid1_4_0_, reviewer0_.email as email2_4_0_, reviewer0_.leeftijdscategorie as leeftijd3_4_0_, reviewer0_.naam as naam4_4_0_, review1_.reviewid as reviewid1_0_1_, review1_.administratie as administ2_0_1_, review1_.bedrijfid as bedrijfi3_0_1_, review1_.commentaar as commenta4_0_1_, review1_.datum as datum5_0_1_, review1_.gemiddelde_cijfer as gemiddel6_0_1_, review1_.minpunten as minpunte7_0_1_, review1_.nakomen_afspraken as nakomen_8_0_1_, review1_.persoonlijke_benadering as persoonl9_0_1_, review1_.pluspunten as pluspun10_0_1_, review1_.reactiesnelheid as reactie11_0_1_, review1_.vakkennis as vakkenn12_0_1_ from reviewerinfo reviewer0_ left outer join bedrijfreviews review1_ on reviewer0_.reviewid=review1_.reviewid where reviewer0_.reviewid=?
public interface ReviewRepository extends JpaRepository<Review, Long> {
@Query(value = "SELECT * FROM bedrijfreviews br LEFT OUTER JOIN reviewerinfo ri ON br.reviewid = ri.reviewid WHERE br.bedrijfId = :id", nativeQuery = true)
List<Review> findByBedrijfId(@Param("id") Long id);
}
@Entity
@Data
public class Review {
@JsonProperty("bedrijfId")
@Column(name = "bedrijfid")
private Long bedrijfId;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@JsonIgnore
private Long reviewId;
@OneToOne(mappedBy = "review", cascade=CascadeType.ALL)
@JoinColumn(name = "reviewid", unique = true)
private Reviewer reviewer;
}
@Entity
@Data
public class Reviewer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "reviewid")
@JsonIgnore
private Long reviewId;
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name = "reviewid", unique = true)
@JsonIgnore
private Review review;
}
С уважением,
Bart