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 JPA 中找不到实体列名称

Spring Boot + 调度程序 + Spring Data JPA + Oracle 中的异常处理

C/C++的#include命令,文件名用尖括号或双撇号括起来的区别

为什么Spring boot JPA本机更新通过postgres数据库提供PSQLException?

Postgres Interval 不适用于本机 Spring 数据 JPA 查询