JPA 2 —在CriteriaQuery中使用@ElementCollection
问题内容:
@Entity
public class Person {
@ElementCollection
private List<Location> locations;
[...]
}
@Embeddable
public class Location {
private Integer dummy;
private Date creationDate;
[...]
}
给定以下结构,我想执行以下SQL的HQL或CriteriaQuery等效项:
SELECT
l.*
FROM
Location l
INNER JOIN
Person p ON (p.id = l.person_id)
WHERE
p.id = ? AND l.creationDate > ?
我想找回与给定人员关联的位置列表,其creationDate在给定位置之后。
提前致谢!
标记
编辑***:我已经编辑了SQL,因为这有点误导。我不想独立查询位置。
问题答案:
这是不可能的,您无法查询Embeddable
。从JPA Wikibook:
的
ElementCollection
映射可以被用来定义的集合
Embeddable
的对象。这不是Embeddable
对象的典型用法,因为对象没有嵌入到源对象的表中,而是存储在单独的收集表中。类似于a
OneToMany
,不同之处在于目标对象是Embeddable
而不是Entity
。这使简单对象的集合易于定义,而无需简单对象定义逆映射Id
或ManyToOne
逆映射。
ElementCollection
还可以覆盖映射或表的集合,因此可以让多个实体引用同一个Embeddable类,但每个实体都将其依赖对象存储在单独的表中。使用a
ElementCollection
代替a 的局限性OneToMany
在于, 不能 独立于其父对象 来查询
,持久化和合并目标对象。它们是严格私有的(从属)对象,与Embedded
映射相同。上没有层叠选项
ElementCollection
,目标对象始终与其父对象保持,合并或删除。
ElementCollection
仍然可以使用提取类型,并且默认为LAZY,与其他集合映射相同。
要实现所需的功能,请使用OneToMany
和Entity
而不是ElementCollection
和Embeddable
。或更改您的方法并查询Person
。