2013-01-12 14 views
5

benim modellerinde (aranabilir) yerelleştirme kullanmak istiyorum ve ben şu modeli ile geldi: Bir ihtiva kategoriler için sorgulamak içinHQL üzerinde seçmek gömülü harita

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

Ne hayır yapmak istediğiniz belirli bir lokalizasyonda CASEINSENSITIVE iğne (örn ile '% aBC%' onların ingilizce adı)

I

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

gibi bir çalıştı ama bu can d olmayan başarısız ereference scalar collection element istisnası.

Şimdi hazırda beklemede olan docu, değerler ve anahtarlar için elementleri() ve indisleri() kullanmam gerektiğini söylüyor. Anahtar için bu, :locale in indices(name)'u kullanarak kolay olurdu, ancak daha sonra bu yerel ayarın bir bölümünü kazandığına göre nasıl ayırt edebilirim?

Ve bu, modelimle hql ile gerçekleştirilemiyorsa, aranabilir yerelleştirmeyi başka nasıl modelleyebilirim?

+0

sonra @Embeddable çözüm kullanıyorum mı orada neden reddedildiğim? – Flo

cevap

3

Sonunda aşağıdaki çözüm geldi (aslında ben de planı kullanarak çalışacak eminim yerine gömülebilir nesne haritalar)

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

ve sorgu (ile ... katılmak kullanarak .. .)

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

Düzenleme: Aslında ben bir harita ile çalışmak için bunu elde edemedi, bu yüzden tüm

+0

aslında, şimdi denedim ve Harita ile çalışmıyor gibi görünüyor - her zaman bir skalar hatasını erteleyemiyorum. 'Anahtar' ve 'değer' işlevlerini sütun adları olarak kullanıyorum, ancak muhtemelen doğru olup olmadığını bilmiyorum. – Flo

+0

Başka örnekler yaptım ve öğrendim, eğer 'Harita ' kullanırsam, sorgum şöyle olmalıdır: 'Kategori c'den aşağıya doğru (c.name [: locale]) gibi: text' – Flo