簡體   English   中英

JPA 2 - 在CriteriaQuery中使用@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 這允許容易地定義簡單對象的集合,而不需要簡單對象來定義IdManyToOne逆映射。 ElementCollection還可以覆蓋其集合的映射或表,因此您可以讓多個實體引用相同的Embeddable類,但每個實體都將其依賴對象存儲在單獨的表中。

使用ElementCollection而不是OneToMany的限制是無法獨立於父對象查詢 ,保留,合並目標對象。 它們是嚴格的私有(依賴)對象,與Embedded映射相同。 ElementCollection上沒有級聯選項,目標對象始終與父級一起保持,合並,刪除。 ElementCollection仍然可以使用fetch類型,默認為LAZY,與其他集合映射相同。

要實現您的目標,請使用OneToManyEntity而不是ElementCollectionEmbeddable 或者更改您的方法並查詢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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM