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

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

@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 с моей моделью, как еще я могу смоделировать локализацию с возможностью поиска?


person Flo    schedule 12.01.2013    source источник
comment
Есть ли причина, по которой меня заминусовали?   -  person Flo    schedule 13.01.2013


Ответы (1)


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

@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.

person Flo    schedule 12.01.2013
comment
на самом деле, я попробовал это сейчас, и, похоже, это не работает с Map‹String, String› - я всегда получаю ошибку не могу отложить скаляр. Я использую «ключ» и «значение» в качестве имен столбцов, но, вероятно, не знаю, правильно ли это. - person Flo; 13.01.2013
comment
Я сделал несколько других примеров и выяснил, что если я использую Map<String, String>, то мой запрос должен быть: from Category c where lower(c.name[:locale]) like :text - person Flo; 16.02.2013