【问题标题】:Is it possible to override Hibernate's 'like' operator in HQL?是否可以在 HQL 中覆盖 Hibernate 的“like”运算符?
【发布时间】:2010-06-17 14:38:48
【问题描述】:

我想知道以下在 Hibernate 中是否可行;在编写 HQL 查询时,您可以这样说

select foo from Foo where foo.barString like "%baz%"

假设 Foo 类有一个名为 barString 的 String 属性,这将起作用。

现在,假设 Foo 是 Bar 类型的 bar 属性,但 Bar 具有众所周知的规范字符串表示。假设这是可以轻松快速地计算(例如,通过连接)的东西,但它不存储在数据库中。有没有办法映射/修改类,以便您可以编写类似的东西

 select foo from Foo where foo.bar like "%baz%"

或

 select foo from Foo where foo.bar.toCanonicalString like "%baz%"

甚至

 select foo from Foo where toCanonicalString(foo.bar) like "%baz%"

?

谢谢 酸碱度

【问题讨论】:

  • 问题是 HQL 用于在 DB 上运行查询,而不是 java 对象本身。所以它必须以某种方式翻译成 SQL,你如何将一些通用的 java 方法翻译成 SQL?我会说你必须在 SQL 中表示toCanonicalString ,比如from Foo where CONCAT(foo.bar, foo.something) like "%baz%"。如果它不能被翻译成 SQL,那么 Hibernate 也不能自动完成。
  • 当然,如果可能的话,我正在寻找一种在 HQL 级别进行翻译的方法。 (最后,很明显,我得向 HQL 解释一下这个函数)
  • 您可以重新映射 hql 函数以生成不同的 sql,例如registerFunction("substring", new SQLFunctionTemplate(Hibernate.STRING, "substring(?1, ?2, ?3)" ) );但我认为您不能在属性转换为 sql 之前对其进行操作。
  • @phtrivier 您的 bar 对象中不会包含字符串字段吗?如果是,为什么不使用where foo.bar.stringField like "%baz%"
  • @NaveenBabu 不,我的对象不一定有代表它的字符串字段。如果我没记错的话,我正在处理电话号码;我将它们与国家代码、中继线和重要部分一起存储在不同的列中,但我想从用户输入的号码版本中进行搜索。因此,如果我有 33、0 和 6xyz 的三列,大多数用户都想输入“+336xyz”或“06xyz”,或者只是“6xy”来查找数字。所以我必须进行连接(和其他转换)。

标签: hibernate hql


【解决方案1】:

对于您的问题,您可以在映射中使用公式 使用 xml: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-column

带有注释: http://docs.jboss.org/ejb3/app-server/HibernateAnnotations/reference/en/html_single/index.html#d0e2009

那就是你的 hql 中有一个计算字段

【讨论】:

    猜你喜欢
    • 2014-10-16
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 2017-03-09
    相关资源
    最近更新 更多