是否可以覆盖Hibernate';s';比如';HQL中的运算符?

是否可以覆盖Hibernate';s';比如';HQL中的运算符?,hibernate,hql,Hibernate,Hql,我想知道以下在Hibernate中是否可行:;在编写HQL查询时,您可以说 select foo from Foo where foo.barString like "%baz%" 假设类Foo有一个名为barString的String属性,则可以这样做 现在,假设Foo是bar类型的bar属性,但该bar具有众所周知的规范字符串表示形式。假设这是一个可以轻松快速计算的东西(比如,通过串联),但它不存储在数据库中。有没有一种方法可以映射/修改这个类,这样您就可以编写类似于 select fo

我想知道以下在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 toCanonicalString(foo.bar) like "%baz%"
?

谢谢
PH

对于您的问题,您可以在映射中使用公式 使用xml:

带注释:


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