Spring Boot JPA - 本机查询双撇号上的 SQL 错误
Posted
技术标签:
【中文标题】Spring Boot JPA - 本机查询双撇号上的 SQL 错误【英文标题】:Spring Boot JPA - SQL error on native query double apostrophe 【发布时间】:2021-10-29 16:28:30 【问题描述】:我有一个在普通 postgres 中运行良好的大型查询,但是当我在 JPA 本机查询中运行时,我收到以下错误:
org.postgresql.util.PSQLException: ERROR: syntax error at or near ":"
查询包含以下行:
...
WHERE year = extract( year FROM CURRENT_DATE - '2 month'::interval)::int
and month = extract( month FROM CURRENT_DATE - '2 month'::interval)::int
...
我尝试通过在每个撇号前添加 \ 来进行转义,但代码无法编译:
error: illegal escape character
" WHERE year = extract( year FROM CURRENT_DATE - '2 month'\:\:interval)\:\:int and month = extract( month FROM CURRENT_DATE - '2 month'\:\:interval)\:\:int \n" +
在本机查询中不能使用 :: 吗?再次正常运行时,这工作得很好。
【问题讨论】:
JPA 无条件地采用:
作为参数名称指示符。每个冒号必须用 两个 反斜杠 (\\) 转义。你可以看看this SO 线程。
【参考方案1】:
您可以完全避免计算必要的转义序列的头痛。 Postgres 使用双冒号 (::) 作为专有的 CAST 操作,但支持 SQL 标准。此外,除了将字符串 '2 month'
转换为间隔之外,您还可以通过为其添加前缀声明它。然后您的子句变为:
where year = cast (extract( year FROM CURRENT_DATE - interval '2 month') as integer)
and month = cast (extract( month FROM CURRENT_DATE - interval '2 month') as integer)
无需转义。并使其更易于阅读(即理解)。
【讨论】:
以上是关于Spring Boot JPA - 本机查询双撇号上的 SQL 错误的主要内容,如果未能解决你的问题,请参考以下文章
如何根据postgres的jsonb列的where条件(无本机查询)使用jpa在spring boot中选择数据?
Spring Boot + 调度程序 + Spring Data JPA + Oracle 中的异常处理
C/C++的#include命令,文件名用尖括号或双撇号括起来的区别