[英]Using @ElementCollection in CriteriaQuery (or Querying over the content of an @ElementCollection)
[英]JPA 2 — Using @ElementCollection in CriteriaQuery
@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,因为它有点误导。 我不想独立查询位置。
这是不可能的,你不能查询一个Embeddable
。 来自JPA Wikibook:
嵌入式集合
ElementCollection
映射可用于定义Embeddable
对象的集合。 这不是Embeddable
对象的典型用法,因为对象未嵌入源对象的表中,而是存储在单独的集合表中。 这类似于OneToMany
,但目标对象是Embeddable
而不是Entity
。 这允许容易地定义简单对象的集合,而不需要简单对象来定义Id
或ManyToOne
逆映射。ElementCollection
还可以覆盖其集合的映射或表,因此您可以让多个实体引用相同的Embeddable类,但每个实体都将其依赖对象存储在单独的表中。使用
ElementCollection
而不是OneToMany
的限制是无法独立于父对象查询 ,保留,合并目标对象。 它们是严格的私有(依赖)对象,与Embedded
映射相同。ElementCollection
上没有级联选项,目标对象始终与父级一起保持,合并,删除。ElementCollection
仍然可以使用fetch类型,默认为LAZY,与其他集合映射相同。
要实现您的目标,请使用OneToMany
和Entity
而不是ElementCollection
和Embeddable
。 或者更改您的方法并查询Person
。
Pascal回复中的关键词是
目标对象无法独立于其父对象进行查询,保持,合并
由于你依赖于父对象,你应该可以使用类似的东西来做到这一点。
SELECT p FROM PERSON, IN (p.locations) WHERE p.id = ?1 AND locations = ?2
(根据执行“MEMBER OF”的回复查询JP-QL(JPA 2.0)中的'ElementCollection'地图字段 - 这实际上是一个Map @ElementCollection,这就是我正在寻找的答案!)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.