我是JPA的新手,现在遇到了问题!
我有两个表人和人物地址。
在人实体中,我有
@OneToMany(mappedBy="personid")
private Set<Personaddress> personaddressCollection;
和
public Set<Personaddress> getPersonaddressCollection() {
return this.personaddressCollection;
}
public void setPersonaddressCollection(Set<Personaddress> personaddressCollection) {
this.personaddressCollection = personaddressCollection;
}
在 PersonAddress 实体中,我有
@ManyToOne
@JoinColumn(name="PERSONID")
private Person personid;
我正在进行类似下面的查询:
List<Person> personlist = em.createQuery("SELECT e FROM Person e").getResultList();
我希望它返回Person表中的所有数据以及Person实体中可用的SetAddress表中的数据。 personlist的大小是正确的,但是当我尝试读取PersonAddress集合时,我得到的是null值。但是数据库中有值,它不能为空。
对应每个合作伙伴,将有一个不会为null的PartnerAddress。 如果我到目前为止所做的事情是错误的,我如何用JPA查询呢?
请帮忙。
答案 0 :(得分:3)
我希望它返回Person表中的所有数据以及Person实体中的Person available表中的PersonAddress表中的数据。
默认情况下,OneToMany
为LAZY
,因此SELECT e FROM Person e
不会加载相关地址的集合。
如果您想要更改此行为,请使关联急切:
@OneToMany(mappedBy="personid", fetch=FetchType.EAGER)
private Set<Personaddress> personaddressCollection;
或者使用FETCH JOIN预取关联:
SELECT e FROM Person e LEFT JOIN FETCH e.personaddressCollection
使用后一种方法,当您不需要地址时,仍然可以从延迟加载中受益。前一种方法“全局”地改变了行为。
personlist的大小是正确的,但是当我尝试读取PersonAddress集合时,我得到的是null值。但是数据库中有值,它不能为空。
这是某种“另一个”问题。我的建议是激活SQL语句的日志记录,以查看执行的查询是什么以及为什么没有获得相应的地址。数据一定有问题。