1

我正在尝试学习 Java 持久性 API。所以它写在 JPA 2.1 规范的 page174 上:

在以下示例中,contactInfo 表示由地址和电话集组成的可嵌入类。电话是一个实体。

SELECT p.vendor FROM Employee e JOIN e.contactInfo.phones p
WHERE e.contactInfo.address.zipcode = '95054' 

下面的查询等价于上面的查询:

SELECT p.vendor FROM Employee e JOIN e.contactInfo c JOIN c.phones p WHERE e.contactInfo.address.zipcode = '95054'

然后在第 176 页:下面的查询通过 Employee、ContactInfo 和 Phone 连接。ContactInfo 是一个可嵌入的类,它包含一个地址和一组电话。电话是一个实体。

SELECT p.vendor FROM Employee e JOIN e.contactInfo c JOIN c.phones p WHERE c.address.zipcode = '95054'

因此,当我尝试执行此类查询时,只有第一个有效。最后两个查询导致错误:线程“main”中的异常java.lang.IllegalArgumentException:在EntityManager中创建查询时发生异常:异常描述:编译问题[SELECT p.vendor FROM Employee e JOIN e.contactInfo c JOIN c。 phoneNumbers p WHERE c.address.zipcode = 'zip2']。[37, 50] 集合值路径“e.contactInfo”必须解析为关联字段。

谁能解释这是为什么?我还尝试从规范中重现连接到可嵌入类的其他示例,但总是遇到相同的错误。

谢谢您最好的问候

4

1 回答 1

0

Embeddable 不能用于连接操作。

如果您说contactInfo 是可嵌入的,则无法做到这一点。

SELECT p.vendor FROM Employee e JOIN e.contactInfo

SELECT p.vendor FROM Employee e JOIN e.contactInfo.phones p WHERE e.contactInfo.address.zipcode = '95054'

不等于

SELECT p.vendor FROM Employee e JOIN e.contactInfo c JOIN c.phones p WHERE e.contactInfo.address.zipcode = '95054'

e.contactInfo.phones应该是一个收藏价值,同时e.contactInfo只是一个可嵌入的

ContactInfo 的映射可能是这样的。

@Embeddable
public class ContactInfo{
 @OneToMany
 private Collection<Phone> phones;
}
于 2014-04-02T04:32:59.537 回答