Spring数据:CONCAT在与TRANSLATE一起使用时删除逗号

时间:2018-01-05 17:41:27

标签: spring hibernate spring-data spring-data-jpa jpql

我正在尝试执行以下查询:

SELECT p FROM Pessoa p WHERE TRANSLATE(UPPER(p.nome), 'ÂÁÀÄÃÊÉÈËÎÍÌÏÔÓÒÖÕÛÚÙÜÇ', 'AAAAAEEEEIIIIOOOOOUUUUC') LIKE CONCAT('%',TRANSLATE(UPPER(?1), 'ÂÁÀÄÃÊÉÈËÎÍÌÏÔÓÒÖÕÛÚÙÜÇ', 'AAAAAEEEEIIIIOOOOOUUUUC'),'%')

但我意识到hibernate正在生成以下最终SQL:

... where TRANSLATE(upper(pessoa0_.ds_nome), 'ÂÁÀÄÃÊÉÈËÎÍÌÏÔÓÒÖÕÛÚÙÜÇ', 'AAAAAEEEEIIIIOOOOOUUUUC') like ('%'||TRANSLATE(upper(?)||'ÂÁÀÄÃÊÉÈËÎÍÌÏÔÓÒÖÕÛÚÙÜÇ'||'AAAAAEEEEIIIIOOOOOUUUUC')||'%')...

请注意,TRANSLATE函数中的逗号被 || 替换,导致 org.postgresql.util.PSQLException:ERROR:函数translate(text)不存在

我做错了什么?

Spring:4.3.4.RELEASE

Spring数据:spring-data-jpa:1.10.5.RELEASE

1 个答案:

答案 0 :(得分:0)

Hibernate并不是简单地替换逗号。它正在转换JPQL(或可能是HQL)查询到SQL。双管||是JPQL CONCAT函数的常用SQL语法。

如果它对你的Postgres数据库不起作用,你可能使用了错误的方言。配置Hibernate为您的数据库使用正确的Dialect。

See for example this article了解如何做到这一点。