我看了类似的问题,但答案对我没有用..
问题:当我在查询中选择多个父实体时,该查询已连接到其某些@OneToOne
子实体,查询会select
为其每个子实体执行语句。没有join fetch
它按预期执行。
Suser
实体有关系;
@OneToOne(optional = false, fetch = FetchType.LAZY)
@Cascade(value = { CascadeType.PERSIST, CascadeType.DELETE })
public SuserStats stats;
@OneToOne(fetch=FetchType.LAZY)
@Cascade(value = {CascadeType.PERSIST})
public Profile profile;
SuserStats
与其所有者的实体关系;
@OneToOne
@JoinColumn
public Suser owner;
Profile
与其所有者的实体关系;
@OneToOne(optional = false, mappedBy = "profile")
public Suser user;
当我执行查询时;
select u from Suser u where u.id in
(select f.targetUser.id from Friendship f where f.sourceUser = ?)
正如预期的那样,在单个查询中仅获取关系的 id。没关系。lazy fetch
正在工作中..
但是,当我将其更改为;(这次我要他们拿来)
select u from Suser u left join fetch u.stats s left join fetch u.profile where u.id in
(select f.targetUser.id from Friendship f where f.sourceUser = ?)
正在执行 2n+1 个查询。每个查询用于配置文件和统计信息的关系。我尝试了很多这里解释的方法,但它们并没有解决我的问题。我想我在定义父子关系时遗漏了一些基本的东西..
提前致谢..