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。这使简单对象的集合易于定义,而无需简单对象定义逆映射IdManyToOne逆映射。
ElementCollection还可以覆盖映射或表的集合,因此可以让多个实体引用同一个Embeddable类,但每个实体都将其依赖对象存储在单独的表中。


使用a ElementCollection代替a 的局限性 OneToMany在于, 不能 独立于其父对象 来查询
,持久化和合并目标对象。它们是严格私有的(从属)对象,与Embedded映射相同。上没有层叠选项
ElementCollection,目标对象始终与其父对象保持,合并或删除。
ElementCollection仍然可以使用提取类型,并且默认为LAZY,与其他集合映射相同。

要实现所需的功能,请使用OneToManyEntity而不是ElementCollectionEmbeddable。或更改您的方法并查询Person