2013-01-12 5 views
5

ich verwenden möchte (durchsuchbar) Lokalisierung in meiner Modelle, und ich kam mit dem folgenden Modell bis:HQL wählen auf Embedded-Karte

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

Was möchte ich nicht tun, ist für die Kategorien abzufragen, die ein enthalten CASEINSENSITIVE Nadel in einer bestimmten Lokalisation (zB mit '% abc%' in ihrem Englisch Namen)

ich habe versucht, so etwas wie

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

aber das scheitert mit einem kann nicht d Eference Skalar Collection Element Ausnahme.

Jetzt die Hibernate Doku sagt, ich muss elements() und Indizes() für Werte und Schlüssel verwenden. Für den Schlüssel wäre dies einfach mit :locale in indices(name), aber wie kann ich dann einen Teil des Wertes dieses Gebiets in einer Casesunsensitive Weise übereinstimmen?

Und nur für den Fall, dass dies nicht mit HQL mit meinem Modell machbar ist, wie sonst könnte ich durchsuchbare Lokalisierung modellieren?

+0

gibt es die @Embeddable Lösung verwenden ein Warum wurde ich abgelehnt? – Flo

Antwort

3

Ich kam schließlich mit der folgenden Lösung bis (eigentlich bin ich ziemlich sicher, dass es auch Plan Karten anstelle des embeddable-Objekt funktionieren würde)

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

und die Abfrage (zusammen mit ... mit .. .)

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

Edit: es tatsächlich mit einer Karte zu arbeiten, ich war nicht in der Lage zu bekommen, so dass ich nach allen

+0

tatsächlich, ich habe es jetzt versucht, und es scheint nicht mit Map arbeiten - ich bekomme immer einen kann nicht skalar Fehler verschieben. Ich verwende 'key' und 'value' als Spaltennamen, weiß aber wahrscheinlich nicht, ob das korrekt ist. – Flo

+0

Ich habe einige andere Beispiele gemacht und herausgefunden, dass, wenn ich 'Map ' verwende, meine Abfrage dann lauten sollte: 'von Kategorie c wo niedriger (c.name [: locale]) wie: text' – Flo