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