Hibernate все еще запрашивает N + 1, хотя использует пользовательский запрос - PullRequest
0 голосов
/ 20 мая 2019

Я создал двунаправленную связь 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

...