首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用JPA和Join优化请求?

如何使用JPA和Join优化请求?
EN

Stack Overflow用户
提问于 2019-12-10 19:21:43
回答 1查看 68关注 0票数 0

我想优化对搜索请求的处理

我有一个主要对象Referentiel:

代码语言:javascript
复制
@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“

代码语言:javascript
复制
@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;

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

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

代码语言:javascript
复制
@Query("select referentiel_metal from ReferentielMetal referentiel_metal where referentiel_metal.reference.id = :referenceId")
List<ReferentielMetal> findAllByReferenceId(@Param("referenceId") Long referenceId);

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

代码语言:javascript
复制
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=?

但在此之后,我在日志中看到了对引用表的请求

代码语言:javascript
复制
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字段执行left join

在@ManyToOne Metal金属上未执行任何请求

你有主意吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-10 19:41:38

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

但是如果你想取消这个操作,你可以使用"lazy“参数来取消。一旦你请求数据,它就会获取数据。

代码语言:javascript
复制
@OneToMany(fetch = FetchType.LAZY)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59266086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档