未绑定命名参数:Spring Boot 中的 DATE_FORMAT 本机查询

Posted

技术标签:

【中文标题】未绑定命名参数:Spring Boot 中的 DATE_FORMAT 本机查询【英文标题】:Named parameter not bound : DATE_FORMAT Native Query in Spring Boot 【发布时间】:2020-10-14 13:32:55 【问题描述】:

我正在尝试使用 Spring Boot 中的 mysql Native Query 在 dateFrom 和当前日期之间使用 select 查询将表数据作为列表获取。 MySQL 数据库字段数据类型为 String。

以下是存储库中的查询:

@Query(value = "select * from Account where DATETIMESTAMP >= :dateFrom  AND DATETIMESTAMP < :DATE_FORMAT(curdate(), '%d/%m/%Y')", nativeQuery = true)
List<Account> findByDate(@Param("dateFrom") String dateFrom);

在 Spring Boot 中获取上述查询的以下错误:

 Named parameter not bound : DATE_FORMAT; nested exception is org.hibernate.QueryException: Named parameter not bound : DATE_FORMAT

谁能帮我把查询框起来。

【问题讨论】:

去掉:前面的冒号DATE_FORMAT 【参考方案1】:

:DATE_FORMAT(curdate(), '%d/%m/%Y') 中删除:: 用于在 jpa 查询中绑定参数。在DATE_FORMAT 前面添加: 使得JPA 认为它是一个参数。 所以最终的查询应该是

@Query(value = "select * from Account where DATETIMESTAMP >= :dateFrom  AND DATETIMESTAMP < DATE_FORMAT(curdate(), '%d/%m/%Y')", nativeQuery = true)
List<Account> findByDate(@Param("dateFrom") String dateFrom);

【讨论】:

但它给出了空集。查询类似于 select * from Account where DATETIMESTAMP &gt;= "12/01/2020" AND DATETIMESTAMP &lt; DATE_FORMAT(curdate(), '%d/%m/%Y');DATETIMESTAMP value in DB is 2020-01-15T06:20:36.793Z。 @Shawrup 我认为您的 DATETIMESTAMP 字段是 VARCHAR 并且 DATETIMESTAMP >= "12/01/2020" 正在比较两个字符串。比较不会比较两个日期,而是会按字母顺序比较两个字符串,例如像“123”将小于“2”。因此,如果您可以将时间转换为 DateTime,那将是更可取的。否则你需要像你在 db 中那样格式化 dateString。由于它们是相同的格式字符串比较将起作用。从帐户中选择 * 其中 dateT >= "2020-01-01T00:00:00Z" AND dateT 【参考方案2】:

无论如何,如果你遇到这个问题。在进行调试或深度谷歌搜索之前检查以下事项

    方法变量名称和您的查询变量是否匹配。

    使用您的参数查询分号

    如果您使用短表达式重命名表,请仔细检查它们是否正确使用。

    检查您的查询语法。

因为大部分问题都来自上述小错误。

【讨论】:

以上是关于未绑定命名参数:Spring Boot 中的 DATE_FORMAT 本机查询的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot Web项目之参数绑定

由于未绑定的 RestTemplate,Spring-Boot RestClientTest 无法正确自动配置 MockRestServiceServer

Spring Boot显示sql参数绑定?

Spring BootSpring Boot之自定义配置参数绑定到Java Bean

spring boot 提交参数绑定List下标越界,超过256,java.lang.IndexOutOfBoundsException异常

Android Lint 检查中的“命名空间未绑定”