JPA 2 - 在CriteriaQuery中使用@ElementCollection

nih*_*t84 7 java orm jpa criteria-api jpa-2.0

    @Entity
    public class Person {

        @ElementCollection
        private List<Location> locations;

        [...]

    }

    @Embeddable
    public class Location {

        private Integer dummy;

        private Date creationDate;

        [...]

    }
Run Code Online (Sandbox Code Playgroud)

鉴于以下结构,我想执行以下SQL的HQL或CriteriaQuery等价物:

SELECT
    l.*
FROM
    Location l
INNER JOIN
    Person p ON (p.id = l.person_id)
WHERE
    p.id = ? AND l.creationDate > ?
Run Code Online (Sandbox Code Playgroud)

我想找回与给定人员相关联的位置列表,其创建日期在给定人员之后.

提前致谢!

标记

编辑***:我编辑了SQL,因为它有点误导.我不想独立查询位置.

Pas*_*ent 17

这是不可能的,你不能查询Embeddable.来自JPA Wikibook:

嵌入式集合

ElementCollection映射可以被用来定义的集合 Embeddable的对象.这不是Embeddable对象的典型用法,因为对象未嵌入源对象的表中,而是存储在单独的集合表中.这类似于a OneToMany,除了目标对象是一个Embeddable 而不是一个Entity.这允许容易地定义简单对象的集合,而不需要简单对象来定义IdManyToOne反向映射. ElementCollection也可以覆盖其集合的映射或表,因此您可以让多个实体引用相同的Embeddable类,但每个实体都将其依赖对象存储在单独的表中.

使用an ElementCollection而不是a 的限制 OneToMany无法独立于父对象查询,持久化,合并目标对象.它们是严格的私有(依赖)对象,与Embedded映射相同.a上没有级联选项 ElementCollection,目标对象始终与父级一起保持,合并,删除. ElementCollection仍然可以使用获取类型并默认为LAZY与其他集合映射相同.

要实现您想要的,请使用a OneToMany和an Entity而不是an ElementCollection和an Embeddable.或者改变你的方法并查询Person.