Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Выбор HQL на встроенной карте

Автор вопроса: FloОтветов: 1

Я хочу использовать локализацию (с возможностью поиска) в своих моделях, и я придумал следующую модель:

@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

но это не удается с исключением невозможно разыменовать скалярный элемент коллекции.

Теперь документ hibernate говорит, что я должен использовать elements() и index() для значений и ключей. Для ключа было бы легко использовать :locale in indices(name), но как я могу сопоставить часть значения этой локали без учета регистра?

И на всякий случай, если это невозможно с помощью hql с моей моделью, как еще я могу смоделировать локализацию с возможностью поиска?

  • Есть ли причина, по которой меня заминусовали? Flo 13.01.2013

localizationhibernatehql

Ответы

Ответ 1 · рейтинг 3 · Flo

Наконец, я придумал следующее решение (на самом деле я почти уверен, что оно также будет работать с использованием карт плана вместо встраиваемого объекта)

@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;
}

и запрос (используя соединение... с...)

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

Редактировать: На самом деле мне не удалось заставить его работать с картой, поэтому в конце концов я использую решение @Embeddable.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы