我正在使用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来根据语言对结果列表进行排序。
有没有更好,更优雅的方法来完成这项工作?
答案 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;
对于给定的语言,这将检索所有动物的动物翻译。
这可能看起来更复杂,但它也更加规范化,并且不会强迫您在每次使用新语言时更改架构和实体。