2012-03-10 52 views
1

的一個我有以下實體:JPQL爲了通過ElementCollection

Article 
| 
+- @Id long id 
| 
+- @ElementCollection Map<Language, Translation> translations 

Translation 
| 
+- @Column String name 

我想實現的是獲取文章的列表,在給定的語言名稱排序。

喜歡的東西:

SELECT a FROM Article a 
JOIN a.translations t WHERE t.language = ? 
ORDER BY t.name 

的問題是,使用t.language時拋出「無法解析屬性」例外,即使language列在翻譯數據庫表中。

我該如何實現這種行爲?

回答

2

我認爲這不被Hibernate支持。我只是簡單地將翻譯作爲一個實體而不是嵌入式的,並且在翻譯實體中包含一個語言字段。

映射將

@OneToMany 
@JoinColumn(name = "article_id") 
@MapKey(name = "language") 
private Map<Language, Translation> translations; 

該協會還可以是雙向的,那麼你的查詢可能會更加合乎邏輯的和不那麼危險,因爲它可能會返回翻譯,而不是文章:

select t from Translation t 
inner join fetch t.article 
where t.language = :language 
order by t.name 
+0

謝謝!沒有改變Embeddable for Entity的解決方案嗎?它增加了數百萬的價值(翻譯的ID),我永遠不會使用它,我有點擔心表現。 – 2012-03-10 13:28:13

+0

它如何增加任何價值?數據庫模式應該(或者至少可以)是相同的。代理主鍵通常可以提高性能,而不是降低性能。 – 2012-03-10 13:33:06

+0

有添加ID列。對於數百萬行是非常重要的。但我知道沒有其他選擇。 – 2012-03-10 15:34:21