【问题标题】:Wrong number of parameters of TRIM function in Hibernate @FormulaHibernate @Formula中TRIM函数的参数数量错误
【发布时间】:2013-06-25 11:26:10
【问题描述】:

我正在尝试制定一个公式来选择用户个人资料的用户友好名称。如果其中至少一个不为空且不为空(包含非空白字符),则选择 firstname + ' ' + lastname,否则选择 shortname (与条件),最后,如果 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();
   }

结果是:

org.hibernate.HibernateException: Unexpected number of trim function operands : 10

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

Profile
  bigint id
  text shortname

SocialProfile
  bigint id
  text firstname
  text lastname

它们通过 id 字段一对一相关,在 Java 代码中 SocialProfile 扩展 Profile。在 PgAdmin SQL 编辑器中,此请求完美运行。

【问题讨论】:

    标签: hibernate parameters formula trim


    【解决方案1】:

    我也遇到过这个问题。似乎@Formula 委托给Hibernate's internal "where template" parser,它并不期望嵌套在trim() 中的另一个函数。这个问题之前被报告为HHH-5970,但他们没有做任何事情。

    解决方法很简单:不要在@Formula 中以这种方式使用trim()。而是使用例如ltrim(rtrim(..)) 甚至是一个特定于 DB 的正则表达式函数,它将 "^\s+|\s+$" 替换为 "",具体取决于所使用的 DB 的功能。

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

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

    【讨论】:

      【解决方案2】:

      由于 Hibernate 更改公式的内容以便能够附加到原始查询,我也遇到了公式注释的许多问题。 这导致我在这些情况下使用 db 视图,而不是使用不可预测的 Hibernate 公式。

      【讨论】:

        猜你喜欢
        • 2023-03-06
        • 1970-01-01
        • 2012-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多