Hibernate / JPA CriteriaQuery修剪函数是否会为PostgreSQL生成错误的SQL

时间:2017-01-10 21:58:46

标签: hibernate jpa criteria jpa-2.1

我尝试使用Criteria Query trim()函数去除数据库中字段的前导零。标准查询的相关部分是:

final Expression<String> _code = cmm.get(CodeMasterMapping_.code);
builder.equal(builder.trim(Trimspec.LEADING, Character.valueOf('0'), _code), productCode)));

此代码段生成的SQL是:

trim(LEADING 0 from codemaster3_.comm_code)=?)

这导致Postgres的以下例外:

  

PSQLException:错误:函数pg_catalog.ltrim(字符变化,整数)不存在   提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。

然后我将零0更改为一个字符,认为postgres可能会将零0解释为整数,从而触发异常。

将要删除的字符更改为A

builder.equal(builder.trim(Trimspec.LEADING, Character.valueOf('A'), _code), productCode)));

但是会生成这个SQL:

trim(LEADING A from codemaster3_.comm_code)=?)

以及以下SQL异常:

  

PSQLException:错误:列&#34; a&#34;不存在

我已经使用完全相同的结果对以下组合进行了测试

  • Postgres 9.5.5,Wildfly 9.0.2.Final&amp; Hibernate Core {4.3.10.Final}
  • Postgres 9.5.5,Wildfly 10.1.0.Final&amp; Hibernate Core {5.0.10.Final}

如果您需要更多Criteria Query代码,请与我们联系。

根据9.5的Postgres文档,trim函数采用以下参数:

trim([leading | trailing | both] [characters] from string)

,给出的例子是:

trim(both 'x' from 'xTomxx') --> 'Tom'

我使用CriteriaBuilder.trim()函数是否有问题,或者Hibernate是否应该生成使用单引号作为修剪字符的SQL?

0 个答案:

没有答案