未绑定命名参数: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 >= "12/01/2020" AND DATETIMESTAMP < 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 本机查询的主要内容,如果未能解决你的问题,请参考以下文章
由于未绑定的 RestTemplate,Spring-Boot RestClientTest 无法正确自动配置 MockRestServiceServer
Spring BootSpring Boot之自定义配置参数绑定到Java Bean
spring boot 提交参数绑定List下标越界,超过256,java.lang.IndexOutOfBoundsException异常