我想在我的模型中使用(可搜索)本地化,并且我提出了以下模型:
@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()和indices()作为值和键。对于键来说,使用 :locale inindex(name)
很容易,但是我如何才能以不区分大小写的方式匹配该区域设置的部分值呢?
万一这在我的模型中无法通过 hql 实现,我还能如何建模可搜索本地化?
最佳答案
我最终想出了以下解决方案(实际上我很确定它也可以使用平面图而不是可嵌入对象来工作)
@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;
}
和查询(使用 join ... with ...)
from Category c join c.name l with (l.locale = :locale and lower(l.label) like :text)
编辑:实际上我无法让它与 map 一起使用,所以我毕竟使用了@Embeddable解决方案
关于hibernate - 在嵌入 map 上选择 HQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14296113/