【问题标题】:HQL select on embedded map嵌入式地图上的 HQL 选择
【发布时间】:2012-12-27 02:16:24
【问题描述】:

我想在我的模型中使用(可搜索的)本地化,我想出了以下模型:

@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

但是由于无法取消引用标量集合元素异常而失败。

现在休眠文档说,我必须使用 elements() 和 indices() 作为值和键。对于键,使用:locale in indices(name) 很容易,但是我如何才能以不区分大小写的方式匹配此语言环境的部分值?

如果我的模型无法通过 hql 实现这一点,我还能如何对可搜索的本地化进行建模?

【问题讨论】:

  • 我被否决是有原因的吗?

标签: hibernate localization hql


【解决方案1】:

我终于想出了以下解决方案(实际上我很确定它也可以使用平面图而不是可嵌入对象)

@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)

编辑:实际上我无法让它与地图一起使用,所以我毕竟使用@Embeddable 解决方案

【讨论】:

  • 实际上,我现在试过了,但它似乎不适用于 Map - 我总是得到一个 cannot defer skalar 错误。我使用'key'和'value'作为列名,但可能不知道这是否正确。
  • 我做了一些其他的例子,发现如果我使用Map&lt;String, String&gt;,那么我的查询应该是:from Category c where lower(c.name[:locale]) like :text
猜你喜欢
  • 2013-02-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-07
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
相关资源
最近更新 更多