如果参数在 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 层是啥?