2013-01-12 12 views
5

chcę użyć (przeszukiwania) lokalizację w moich modeli, i wpadłem z następującym wzorem:HQL wybrać na wbudowanych map

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

Co chcę zrobić NO kwerendy dla kategorii, które zawierają caseinsensitive igły w określonej lokalizacji (na przykład z „% ABC%” w ich angielskiej nazwy)

próbowałem coś podobnego

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

ale nie z nie mogę d Element wyjątku skalarnego kolekcji.

Teraz dokument hibernacji mówi, że muszę używać elementów() i indeksów() dla wartości i kluczy. Dla klucza byłoby to łatwe przy użyciu :locale in indices(name), ale jak mogę następnie dopasować część wartości tego locale w sposób niewrażliwy na kazeiny?

I na wszelki wypadek, gdy nie można tego zrobić z hql z moim modelem, jak inaczej mogę modelować wyszukiwaną lokalizację?

+0

Czy istnieje powód, dla którego przyznano mi zniżkę? – Flo

Odpowiedz

3

I wreszcie wymyślił następujące rozwiązanie (rzeczywiście jestem całkiem pewien, że również pracować przy użyciu planu mapy zamiast do osadzeniem obiektu)

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

i zapytań (przy użyciu dołącz ... z .. .)

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

Edit: Właściwie byłem w stanie zmusić go do pracy z mapą, więc używam @Embeddable rozwiązanie Wszakże

+0

faktycznie, próbowałem go teraz i nie działa z mapą - zawsze otrzymuję komunikat o błędzie skalarnym. Używam "klucza" i "wartości" jako nazw kolumn, ale prawdopodobnie nie wiem, czy to prawda. – Flo

+0

Zrobiłem kilka innych przykładów i dowiedziałem się, jeśli używam 'Map ' wtedy moje zapytanie powinno brzmieć: 'od Category c, gdzie lower (c.name [: locale]) like: text' – Flo