JPA Criteria API - LEFT OUTER JOIN 未填充 @OneToMany 列表
JPA Criteria API - LEFT OUTER JOIN not populating a @OneToMany List
这是我的实体:
public class Patrimony {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "patrimony")
@JsonManagedReference
private
List<Patrpos> positions;
}
我的代码是:
CriteriaBuilder cb = manager.getCriteriaBuilder();
CriteriaQuery<Patrimony> cq = cb.createQuery(Patrimony.class);
Root<Patrimony> root = cq.from(Patrimony.class);
Join<Patrimony, UserProfile> userprofile = root.join(Patrimony_.userprofile);
Join<Patrimony, Patrpos> joinPatrpos = root.join(Patrimony_.positions, JoinType.LEFT);
root.fetch(Patrimony_.positions);
joinPatrpos.on(cb.equal(joinPatrpos.get(Patrpos_.dtPatrpos), dateproc.minusDays(1)));
cq.select(root);
TypedQuery<Patrimony> query = manager.createQuery(cq);
List<Patrimony> list = query.getResultList();
正在生成的查询看起来没问题,类似于:
select
patrimony0_.id as id1_10_0_,
positions3_.id as id1_11_1_,
patrimony0_.category_id as categor15_10_0_,
patrimony0_.description as descript2_10_0_,
patrimony0_.vl_valuation_start as vl_valu14_10_0_,
positions3_.dt_patrpos as dt_patrp2_11_1_,
positions3_.vl_patrpos as vl_patrp6_11_1_,
from
patrimony patrimony0_
inner join
userprofile userprofil1_
on patrimony0_.userprofile_id=userprofil1_.id
left outer join
patrpos positions2_
on patrimony0_.id=positions2_.patrimony_id
and (
positions2_.dt_patrpos=?
)
inner join
patrpos positions3_
on patrimony0_.id=positions3_.patrimony_id
where userprofil1_.id=161
查询似乎返回了我需要的所有数据,实体 Patrimony 返回时所有数据都正常,但 "List positions" 属性除外,该属性始终为 null。
谢谢。
查看单元测试,我注意到在插入测试数据后我没有调用 flush() 和 clear()。我在调用查询之前添加了 flush 和 clear,并且所有实体都已正确填充。
谢谢大家的评论。
这是我的实体:
public class Patrimony {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "patrimony")
@JsonManagedReference
private
List<Patrpos> positions;
}
我的代码是:
CriteriaBuilder cb = manager.getCriteriaBuilder();
CriteriaQuery<Patrimony> cq = cb.createQuery(Patrimony.class);
Root<Patrimony> root = cq.from(Patrimony.class);
Join<Patrimony, UserProfile> userprofile = root.join(Patrimony_.userprofile);
Join<Patrimony, Patrpos> joinPatrpos = root.join(Patrimony_.positions, JoinType.LEFT);
root.fetch(Patrimony_.positions);
joinPatrpos.on(cb.equal(joinPatrpos.get(Patrpos_.dtPatrpos), dateproc.minusDays(1)));
cq.select(root);
TypedQuery<Patrimony> query = manager.createQuery(cq);
List<Patrimony> list = query.getResultList();
正在生成的查询看起来没问题,类似于:
select
patrimony0_.id as id1_10_0_,
positions3_.id as id1_11_1_,
patrimony0_.category_id as categor15_10_0_,
patrimony0_.description as descript2_10_0_,
patrimony0_.vl_valuation_start as vl_valu14_10_0_,
positions3_.dt_patrpos as dt_patrp2_11_1_,
positions3_.vl_patrpos as vl_patrp6_11_1_,
from
patrimony patrimony0_
inner join
userprofile userprofil1_
on patrimony0_.userprofile_id=userprofil1_.id
left outer join
patrpos positions2_
on patrimony0_.id=positions2_.patrimony_id
and (
positions2_.dt_patrpos=?
)
inner join
patrpos positions3_
on patrimony0_.id=positions3_.patrimony_id
where userprofil1_.id=161
查询似乎返回了我需要的所有数据,实体 Patrimony 返回时所有数据都正常,但 "List positions" 属性除外,该属性始终为 null。
谢谢。
查看单元测试,我注意到在插入测试数据后我没有调用 flush() 和 clear()。我在调用查询之前添加了 flush 和 clear,并且所有实体都已正确填充。
谢谢大家的评论。