6

モデルで(検索可能な)ローカリゼーションを使用したいのですが、次のモデルを思いつきました。

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

私がしたくないのは、特定のローカリゼーションで大文字と小文字を区別しない針を含むカテゴリをクエリすることです(たとえば、英語名に「%abc%」が含まれています)

私は次のようなことを試みました

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

ただし、スカラーコレクション要素の例外を逆参照できないため失敗します。

今、休止状態のドキュメントは、値とキーにelements()とindexes()を使用する必要があると言っています。キーの場合、これは簡単に使用:locale in indices(name)できますが、大文字と小文字を区別しない方法でこのロケールの値の一部を一致させるにはどうすればよいですか?

そして、これが私のモデルのhqlで実行できない場合に備えて、他にどのように検索可能なローカリゼーションをモデル化できますか?

4

1 に答える 1

3

私はついに次の解決策を思いつきました(実際には、埋め込み可能なオブジェクトの代わりにプランマップを使用しても機能すると確信しています)

@Entity
public class Category {
    ...
    @ElementCollection
    @CollectionTable(name = "locale_category_name", joinColumns=@JoinColumn(name="id"))
List<Localization> name;
    ...
}

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

およびクエリ(join ... with ...を使用)

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

編集:実際には、マップで動作させることができなかったので、結局@Embeddableソリューションを使用しています

于 2013-01-12T19:41:59.293 に答える