联接到 JPA2.1 规范中的可嵌入类 - 联系信息 - 集合值路径必须解析为关联字段



我正在尝试学习Java Persistance API。所以它写在 JPA 2.1 规范的第 174 页上:

在下面的示例中,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 页:下面的查询通过"员工"、"联系信息"和"电话"加入。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"必须解析为关联字段。

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

谢谢此致敬意

嵌入不能在连接操作中使用。

如果你说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;
}

相关内容

  • 没有找到相关文章

最新更新