Java JPQL按ElementCollection之一排序

Java JPQL按ElementCollection之一排序,java,hibernate,jpa,jpql,Java,Hibernate,Jpa,Jpql,我有以下实体: Article | +- @Id long id | +- @ElementCollection Map<Language, Translation> translations Translation | +- @Column String name 问题是,当使用t.language时,抛出“无法解析属性”异常,即使翻译数据库表中存在language列 如何实现这种行为?我认为Hibernate不支持这种行为。我会简单地将翻译作为一个实体而不是一个嵌入式实体,

我有以下实体:

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

Translation
|
+- @Column String name
问题是,当使用
t.language
时,抛出“无法解析属性”异常,即使翻译数据库表中存在
language


如何实现这种行为?

我认为Hibernate不支持这种行为。我会简单地将翻译作为一个实体而不是一个嵌入式实体,并在翻译实体中包含一个语言字段

映射将是

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

非常感谢。没有任何解决方案不改变实体的可嵌入性吗?它增加了数以百万计的值(翻译的ID),我永远不会使用,我有点担心性能。它如何增加任何价值?数据库架构应该(或至少可以)相同。代理主键通常会提高性能,而不是降低性能。对于数百万行来说,这是非常重要的。但我知道没有其他选项。您有另一个选项:保持当前架构不变,并使用现有语言articleId对作为翻译实体的复合ID。此处解释了规则:。您需要一个MapsId注释来说明ManyToOne项目字段映射到与articleId字段相同的列。
 @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