@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 > ?
我想找回与给定人员相关联的位置列表,其创建日期在给定人员之后。
提前致谢!
标记
编辑***:我编辑了SQL,因为它有点误导。我不想单独查询这些位置。
答案 0 :(得分:16)
这是不可能的,您无法查询Embeddable
。来自JPA Wikibook:
Embedded Collections
ElementCollection
映射可以 用来定义一个集合Embeddable
个对象。这不是一个Embeddable
个对象的典型用法 因为对象没有嵌入 源对象的表,但存储在 单独的收集表。这是 类似于OneToMany
,除了 目标对象是Embeddable
而不是Entity
。这允许 要收集的简单对象 容易定义,不需要 简单的对象来定义Id
或。{ManyToOne
逆映射。ElementCollection
也可以覆盖 他们的映射或表格 集合,所以你可以有多个 实体引用相同的Embeddable 上课,但每个商店都有 依赖对象在一个单独的表中。使用的限制
ElementCollection
代替OneToMany
是目标 无法查询对象, 坚持,独立合并 他们的父对象。他们是严格的 私人(从属)对象, 与Embedded
映射相同。 没有级联选项ElementCollection
,目标 对象总是持久化,合并, 与父母一起删除。ElementCollection
仍然可以使用 获取类型并默认为LAZY 与其他集合映射相同。
要实现您的目标,请使用OneToMany
和Entity
代替ElementCollection
和Embeddable
。或者更改您的方法并查询Person
。
答案 1 :(得分:2)
Pascal回复中的关键词是
目标对象无法独立于其父对象进行查询,保留,合并
由于您依赖于父对象,您应该可以使用类似......
之类的东西 SELECT p FROM PERSON, IN (p.locations) WHERE p.id = ?1 AND locations = ?2
(基于Execute "MEMBER OF" query against 'ElementCollection' Map fields in JP-QL (JPA 2.0)的回复 - 这实际上是一个Map @ElementCollection,这就是我正在寻找的答案!)