首页 > 解决方案 > 如何使用 JPA 和 Join 优化请求?

问题描述

我想优化搜索请求的处理

我有一个主要对象Referentiel:

@Entity
@Table(name = "referentiel")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Referentiel implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    @Column(name = "uuid", nullable = false)
    private UUID uuid;

    @NotNull
    @Size(max = 30)
    @Column(name = "reference", length = 30, nullable = false)
    private String reference;

    ....

    @OneToMany(mappedBy = "reference")
    @JsonIgnoreProperties("referentiels")
    private Set<ReferentielMetal> metaux = new HashSet<>();

和对象“ReferentielMetal”

@Entity
@Table(name = "referentiel_metal")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class ReferentielMetal implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

....

    @ManyToOne
    @JsonIgnoreProperties("referentielMetals")
    private Referentiel reference;

    @ManyToOne
    @JsonIgnoreProperties("referentielMetals")
    private Metal metal;

在我的治疗中,我确实要求获得所有具有标准的推荐人。然后我遍历每个事件以完成数据

例如,对于每个Referentiel 对象,我使用ReferentielId 搜索所有ReferentielMetal:

@Query("select referentiel_metal from ReferentielMetal referentiel_metal where referentiel_metal.reference.id = :referenceId")
List<ReferentielMetal> findAllByReferenceId(@Param("referenceId") Long referenceId);

在我的日志中,我看到了请求:

select referentie0_.id as id1_89_, referentie0_.createur_id as createur6_89_, referentie0_.date_creation as date_cre2_89_, referentie0_.date_modification as date_mod3_89_, referentie0_.metal_id as metal_id7_89_, referentie0_.modificateur_id as modifica8_89_, referentie0_.poids as poids4_89_, referentie0_.principal as principa5_89_, referentie0_.reference_id as referenc9_89_ from referentiel_metal referentie0_ where referentie0_.reference_id=?

但紧接着,我在日志中看到引用表上的请求

select referentie0_.id as id1_89_, referentie0_.createur_id as createur6_89_, referentie0_.date_creation as date_cre2_89_, referentie0_.date_modification as date_mod3_89_, referentie0_.metal_id as metal_id7_89_, referentie0_.modificateur_ ...
from referentiel_digital referentie0_ 
left outer join jhi_user user1_ on referentie0_.createur_id=user1_.id 
left outer join jhi_user user2_ on referentie0_.modificateur_id=user2_.id 
left outer join referentiel referentie3_ on referentie0_.reference_id=referentie3_.id 
left outer join fournisseur_entite fournisseu4_ on referentie3_.code_fournisseur_id=fournisseu4_.id
left outer join jhi_user user5_ on fournisseu4_.createur_id=user5_.id 
left outer join entite entite6_ on fournisseu4_.entite_id=entite6_.id 
left outer join jhi_user user7_ on entite6_.createur_id=user7_.id 
left outer join entite entite8_ on entite6_.entite_mere_id=entite8_.id 
left outer join jhi_user user9_ on entite8_.modificateur_id=user9_.id 
left outer join type_entity typeentity10_ on entite8_.type_entity_id=typeentity10_.id 
left outer join jhi_user user11_ on fournisseu4_.modificateur_id=user11_.id 
left outer join fournisseur fournisseu12_ on fournisseu4_.referentiel_id=fournisseu12_.id 
left outer join jhi_user user13_ on fournisseu12_.createur_id=user13_.id 
left outer join four_edi_format_fichier fouredifor14_ on fournisseu12_.edi_format_fichier_id=fouredifor14_.id 
left outer join jhi_user user15_ on fouredifor14_.createur_id=user15_.id 
left outer join jhi_user user16_ on fouredifor14_.modificateur_id=user16_.id 
left outer join entite entite17_ on fournisseu12_.fabricant_id=entite17_.id 
left outer join four_methode_acces_photo fourmethod18_ on fournisseu12_.methode_acces_photo_id=fourmethod18_.id 
left outer join jhi_user user19_ on fourmethod18_.createur_id=user19_.id 
left outer join jhi_user user20_ on fourmethod18_.modificateur_id=user20_.id 
left outer join jhi_user user21_ on fournisseu12_.modificateur_id=user21_.id 
left outer join pays pays22_ on fournisseu12_.pays_id=pays22_.id 
left outer join jhi_user user23_ on referentie3_.createur_id=user23_.id 
left outer join entite entite24_ on referentie3_.entite_id=entite24_.id 
left outer join jhi_user user25_ on referentie3_.modificateur_id=user25_.id 
left outer join referentiel referentie26_ on referentie3_.reference_mere_id=referentie26_.id 
left outer join tva tva27_ on referentie26_.taxe1_id=tva27_.id 
left outer join tva tva28_ on referentie26_.taxe2_id=tva28_.id 
where referentie0_.reference_id=?

我不明白为什么会发起这个请求……我的治疗没有调用这个请求。此请求在Referentiel 的所有@OneToMany 字段上留下了连接

没有对@ManyToOne Metal metal 提出请求

你有想法吗?

标签: javaspring-bootjpaspring-data-jpa

解决方案


默认情况下,如果您获取两个表 Jpa 之间连接的字段,则在 JPA 中通过运行查询获取所有相关数据。

但是如果你想取消这个 Operation ,你可以使用“lazy”参数来完成。一旦您请求它,它将获取数据。

@OneToMany(fetch = FetchType.LAZY)

推荐阅读