JPA / SQL中与语言相关的ORDER BY

时间:2012-06-06 10:17:07

标签: sql jpa jpa-2.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;

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

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

1 个答案:

答案 0 :(得分: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;

对于给定的语言,这将检索所有动物的动物翻译。

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