2013-01-12 44 views
5

我想用(搜索)定位在我的模型,我想出了以下模型:HQL選擇嵌入式地圖

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

我想要做的不就是查詢包含的類別在一個特定的本地化CASEINSENSITIVE針(例如,用「%ABC%」在他們的英文名)

我想是這樣

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

,但失敗了不能d引用標量集合元素異常。

現在休眠實況說,我必須使用的元素()和指數()的值和鍵。對於使用:locale in indices(name)這個鍵很容易,但是我怎樣才能以不區分大小寫的方式匹配這個語言環境的一部分值呢?

和公正的情況下,這是不可行的與我的模型HQL,我還能怎樣模型搜索本地化?

+0

後@Embeddable的解決方案是有一個我之所以被低估? – Flo

回答

3

我終於想出了以下解決方案(其實我敢肯定它也將使用計劃工作映射,而不是嵌入對象)

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

和查詢(使用加入... ..用。)

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

編輯:其實我無法得​​到它與地圖的工作,所以我用所有

+0

實際上,我現在嘗試了它,它似乎不適用於Map - 我總是得到一個無法推遲skalar錯誤。我使用'key'和'value'作爲列名,但可能不知道這是否正確。 – Flo

+0

我做了一些其他的例子,並發現,如果我使用Map '那麼我的查詢應該是:'從類別c其中lower(c.name [:locale])like:text' – Flo