0

我使用 Hibernate 作为具有命名查询的 JPA 提供程序,并想知道是否有一种本地方式来订购结果语言相关的。底层数据库是一些 Oracle R10。

假设您有一个表格动物,其中有一个英文名称列和一个拉丁名称列(可能还有更多.. 法语、德语、意大利语、西班牙语),您必须根据其中一种语言进行排序。

要获得有序列表,您可以使用不同的选择语句,例如这些

SELECT animal from Animal animal order by animal.name_EN;
SELECT animal from Animal animal order by animal.name_LA;
SELECT animal from Animal animal order by animal.name_FR;

等等。或者我所做的是编写一个比较器来根据语言对结果列表进行排序。

有没有更好、更优雅的方式来完成这项工作?

4

1 回答 1

2

相反,操作系统为表中的每种语言添加一列,您应该规范化并有一个附加表 ANIMAL_TRANSLATION:

ID : technical ID, auto incremented
ANIMAL_ID: foreign key to the ANIMAL table
LANGUAGE: the language of this translation
NAME: the translated name

然后,您将在 Animal 和 AnimalTranslation 之间建立一个 OneToMany 关联:

public class Animal {
    /**
     * The translations, indexed by language
     */
    @OneToMany(mappedBy = "animal")
    @MapKey(name = "language")
    private Map<String, AnimalTranslation> translations;

    ...
}

public class AnimalTranslation {
    @ManyToOne
    @JoinColumn(name = "ANIMAL_ID")
    private Animal animal;

    ...
}

例如,您的查询可能是:

select translation from AnimalTranslation translation
inner join fetch transalation.animal animal
where translation.language = :language
order by translation.name;

这将检索给定语言的所有动物翻译及其动物。

这可能看起来更复杂,但也更加规范化,并且不会在每次出现新语言时都强制您更改架构和实体。

于 2012-06-06T13:25:49.977 回答