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

4

2 回答 2

17

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

嵌入式集合

映射可ElementCollection用于定义 Embeddable对象集合。这不是对象的典型用法,Embeddable因为对象没有嵌入源对象的表中,而是存储在单独的集合表中。这类似于 a OneToMany,除了目标对象是 aEmbeddable 而不是 a Entity。这允许容易地定义简单对象的集合,而不需要简单对象定义一个IdManyToOne逆映射。 ElementCollection还可以覆盖映射或它们的集合的表,因此您可以让多个实体引用同一个 Embeddable 类,但让每个实体将它们的依赖对象存储在单独的表中。

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

要实现您想要的,请使用 a OneToManyand anEntity而不是 an ElementCollectionand an Embeddable。或者改变你的方法并查询Person.

于 2010-09-14T12:50:37.067 回答
2

帕斯卡回复中的关键词是

目标对象不能独立于其父对象进行查询、持久化、合并

由于您依赖于父对象,因此您应该能够使用类似 ...

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 这是我正在寻找的答案!)

于 2012-09-02T11:54:24.593 回答