2013-01-12 6 views
5

私は私のモデルに(検索可能)ローカリゼーションを使用したい、と私は次のモデルを思い付いた:含まれているカテゴリを照会するHQLは、上の選択埋め込みマップ

@Entity 
public class Category { 
    ... 
    @ElementCollection 
    //key = language code (e.g. 'en') and value = localized label 
    private Map<String, String> name; 
    ... 
} 

私はノーをやりたいことはあります特にローカライズでCASEINSENSITIVE針(例えばと「%ABC%」自分の英語名で)

私は

from Category where name.key = :locale and lower(name.value) like :text 

のようなものを試してみましたが、それはできないDで失敗しますスカラーコレクション要素例外を参照してください。

ここで、hibernate docuは、値とキーにelements()とindices()を使用する必要があると言います。キーの場合、:locale in indices(name)を使用すると簡単ですが、このロケールの値の一部を大文字小文字を区別しない方法でどのように一致させることができますか?

これは私のモデルでhqlで実行できない場合には、検索可能なローカリゼーションをモデル化するにはどうすればいいですか?

+0

後@Embeddableソリューションを使用していますがありますなぜ私はdownvotedされた理由? – Flo

答えて

3

私は最終的に以下の解決策を考え出した(実際に私は、それはまた、計画を使用して動作しますかなり確信してではなく、組み込み可能なオブジェクトのマッピング)し

@Entity 
public class Category { 
    ... 
    @ElementCollection 
    @CollectionTable(name = "locale_category_name", [email protected](name="id")) 
List<Localization> name; 
    ... 
} 

@Embeddable 
public class Localization { 
    @NotNull 
    public String locale; 
    @NotNull 
    public String label; 
} 

とクエリ(と...結合を使用して... 。)

from Category c join c.name l with (l.locale = :locale and lower(l.label) like :text) 

編集:実際に私は、それは地図で動作するように取得することができませんでしたので、私はすべての

+0

実際には、今試してみましたが、Map で動作しないようです - 私はいつもskalarエラーを延期できません。カラム名として 'key'と 'value'を使用しますが、それが正しいかどうかはわかりません。 – Flo

+0

私はいくつかの他の例を実行して、 'Map 'を使用した場合、私のクエリは次のようになるはずです:' category c from lower(c.name [:locale])like:text' – Flo