0

名前付きクエリで Hibernate を JPA プロバイダーとして使用していますが、言語に依存する結果を並べ替えるネイティブな方法があるかどうか疑問に思いました。基礎となるデータベースは、Oracle R10 です。

英語の名前の列とラテン語の名前の列 (さらに多くの.. フランス語、ドイツ語、イタリア語、スペイン語) を持つ表の動物があり、言語の 1 つに応じて並べ替える必要があるとします。

順序付きリストを取得するには、次のようなさまざまな選択ステートメントを使用できます

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 を作成しました。

これを行うためのより良い、よりエレガントな方法はありますか?

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 に答える