[英]Using @ElementCollection in CriteriaQuery (or Querying over the content of an @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
。 這允許容易地定義簡單對象的集合,而不需要簡單對象來定義Id
或ManyToOne
逆映射。ElementCollection
還可以覆蓋其集合的映射或表,因此您可以讓多個實體引用相同的Embeddable類,但每個實體都將其依賴對象存儲在單獨的表中。使用
ElementCollection
而不是OneToMany
的限制是無法獨立於父對象查詢 ,保留,合並目標對象。 它們是嚴格的私有(依賴)對象,與Embedded
映射相同。ElementCollection
上沒有級聯選項,目標對象始終與父級一起保持,合並,刪除。ElementCollection
仍然可以使用fetch類型,默認為LAZY,與其他集合映射相同。
要實現您的目標,請使用OneToMany
和Entity
而不是ElementCollection
和Embeddable
。 或者更改您的方法並查詢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.