如果参数在 Spring Framework 中的单引号内,@Query 无法识别参数

Posted

技术标签:

【中文标题】如果参数在 Spring Framework 中的单引号内,@Query 无法识别参数【英文标题】:@Query not recognizing parameters if they are inside single quote in Spring Framework 【发布时间】:2018-11-14 14:36:30 【问题描述】:

@Query 中的 Spring Data 有一个大问题。

我有以下疑问:

SELECT created_at::DATE "date",
count(*)
FROM
absence
WHERE
created_at::DATE between '2018-05-27' AND  '2018-05-31'
GROUP BY created_at::DATE;

这个查询可以在 postgres 中正常使用,现在春天可以使用它:

  @Query("SELECT created_at\\:\\:DATE \"date\",count(*) FROM absence " +
            "WHERE created_at\\:\\:DATE between '?1' AND '?2' " +
            "GROUP created_at\\:\\:DATE", nativeQuery = true)
    fun getAbsenceCount(beginDate: String,endDate: String): List<AbsenceCount>

这个查询根本不起作用,问题是spring无法识别parather beginDate (?1) & endDate (?2)。 我尝试了很多来自***的解决方案,例如solution和solution 2,但我无法摆脱这个问题。 不知道是故意的还是春天的bug。

【问题讨论】:

您是否尝试过不在 '?1' 和 '?2' 周围添加引号?它是这样工作的还是显示了一些不同的错误? @KuldeepSidhu 是的,但需要单引号;这是我得到的错误:org.postgresql.util.PSQLException: ERROR: syntax error at or near "created_at" Position: 132 您是否尝试使用不进行任何转换的查询('::date' 等)?你为什么要使用它?? @Cepr0 这是 postgres 的投射方式。我使用这个查询是因为它可以解决我的问题。 我也在使用 postgres 并且只对 jsonb 字段使用强制转换。那么您是否尝试从该查询中排除强制转换? 【参考方案1】:

尝试简单地使用经典的 SQL cast 函数:

@Query(value = "" + 
    "select " +
    "  cast(a.created_at as date) as createdAt, " +
    "  count(*) as quantity " + 
    "from " + 
    "  absence a " + 
    "where " + 
    "  cast(a.created_at as date) between ?1 and ?2 " + 
    "group " + 
    "  cast(a.created_at as date)" + 
    "", nativeQuery = true)
fun getAbsenceCount(beginDate: String, endDate: String): List<AbsenceCount>

其中AbsenceCount 是这样的投影(java):

public interface AbsenceCount 
    LocalDate getCreatedAt();
    Long getQuantity();

【讨论】:

仍然 ?1 和 ?2 不在单引号内,此查询将不起作用。

以上是关于如果参数在 Spring Framework 中的单引号内,@Query 无法识别参数的主要内容,如果未能解决你的问题,请参考以下文章

Spring Framework 中的 Localhost 与 127.0.0.1

Spring Framework 中的 DAO、DTO 和 Service 层是啥?

如何使用 Spring Framework 中的 JdbcTemplate 类执行 INSERT 语句

Spring Framework 6中的新功能和增强功能

Spring Framework 6中的新功能和增强功能

Spring Framework 6中的新功能和增强功能