我正在尝试学习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;
}