【发布时间】: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”来查找数字。所以我必须进行连接(和其他转换)。