2012-03-10 27 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