Hibernate @Formula中TRIM函数的参数数量错误

Ale*_*nko 5 parameters hibernate trim formula

我正在尝试制作一个公式来选择用户配置文件的用户友好名称.它选择firstname +''+ lastname,如果它们中至少有一个不为空而不是空白(包含非空白字符),否则它选择短名称(具有相同条件),最后,如果shortname为空或null,则为选择id,转换为字符串.

@Formula("COALESCE(NULLIF(TRIM(BOTH FROM CONCAT(sp.firstname, ' ', sp.lastname)), ''), TRIM(p.shortname), to_char(p.id, 'FM9999999999999999')) " +
   "FROM socialprofile AS sp " +
   "JOIN profile AS p ON sp.id=p.id")
   public String getUserFriendlyName() {
      return super.getUserFriendlyName();
   }
Run Code Online (Sandbox Code Playgroud)

结果是:

org.hibernate.HibernateException: Unexpected number of trim function operands : 10
Run Code Online (Sandbox Code Playgroud)

但是只有3个参数:CONCAT的两个参数和结果.这个问题有解决方法吗?DB是PostgreSQL 9.1,Hibernate版本是4.2.1.以防万一,这是表结构:

Profile
  bigint id
  text shortname

SocialProfile
  bigint id
  text firstname
  text lastname
Run Code Online (Sandbox Code Playgroud)

它们通过id字段与一对一相关,在Java代码中SocialProfile扩展了Profile.在PgAdmin SQL编辑器中,此请求完美无缺.

Bal*_*usC 5

我也遇到了这个问题。似乎@Formula委托给Hibernate 的内部“where 模板”解析器,它不期望嵌套在trim(). 这个问题之前被报告为HHH-5970,但他们没有做任何事情。

解决方法很简单:不要trim()@Formula. 而是使用 egltrim(rtrim(..))甚至是 DB 特定的正则表达式函数,它替换"^\s+|\s+$"by "",具体取决于正在使用的数据库的功能。

PostgreSQL 支持ltrim()and rtrim(),所以这应该适合你:

@Formula("COALESCE(NULLIF(LTRIM(RTRIM(BOTH FROM CONCAT(sp.firstname, ' ', sp.lastname))), '') [...]"
Run Code Online (Sandbox Code Playgroud)