JPA从实体中的集合中获取值

时间:2010-08-25 19:25:38

标签: java jpa java-ee persistence

我是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查询呢?

请帮忙。

1 个答案:

答案 0 :(得分:3)

  

我希望它返回Person表中的所有数据以及Person实体中的Person available表中的PersonAddress表中的数据。

默认情况下,OneToManyLAZY,因此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语句的日志记录,以查看执行的查询是什么以及为什么没有获得相应的地址。数据一定有问题。

参考

  • JPA 1.0规范
    • 第9.1.24节“OneToMany注释”
    • 第4.4.5.3节“获取联接”