JPA 2 - 在CriteriaQuery中使用@ElementCollection

时间:2010-09-14 12:40:11

标签: java orm jpa jpa-2.0 criteria-api

    @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,因为它有点误导。我不想单独查询这些位置。

2 个答案:

答案 0 :(得分:16)

这是不可能的,您无法查询Embeddable。来自JPA Wikibook:

  

Embedded Collections

     

ElementCollection映射可以   用来定义一个集合   Embeddable个对象。这不是一个   Embeddable个对象的典型用法   因为对象没有嵌入   源对象的表,但存储在   单独的收集表。这是   类似于OneToMany,除了   目标对象是Embeddable   而不是Entity。这允许   要收集的简单对象   容易定义,不需要   简单的对象来定义Id或。{   ManyToOne逆映射。   ElementCollection也可以覆盖   他们的映射或表格   集合,所以你可以有多个   实体引用相同的Embeddable   上课,但每个商店都有   依赖对象在一个单独的表中。

     

使用的限制   ElementCollection代替   OneToMany目标   无法查询对象,   坚持,独立合并   他们的父对象。他们是严格的   私人(从属)对象,   与Embedded映射相同。   没有级联选项   ElementCollection,目标   对象总是持久化,合并,   与父母一起删除。   ElementCollection仍然可以使用   获取类型并默认为LAZY   与其他集合映射相同。

要实现您的目标,请使用OneToManyEntity代替ElementCollectionEmbeddable。或者更改您的方法并查询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,这就是我正在寻找的答案!)