Hibernate 5迁移至6时JPA查询类型不匹配报错问题咨询
Spring Boot 3迁移后Repository查询报错的解决方法
问题根源
Spring Boot 3默认集成Hibernate 6,相较于Hibernate 5,它对JPQL函数的类型校验更为严格。TO_DATE()函数在Hibernate 6中仅用于将字符串类型转换为日期,而你的实体字段effectiveDate本身就是java.util.Date(映射数据库DATE类型),无需额外转换,这是导致类型不匹配异常的核心原因。
修改后的查询代码
直接移除所有TO_DATE()包裹,使用字段本身进行日期运算:
@Query(value = "SELECT ca FROM CorporateActionsV2 ca WHERE ( ca.dividendAmount, TO_CHAR(ca.effectiveDate - 5,'IYYY'), TO_CHAR(ca.effectiveDate - 5,'IW'), ca.tickerSerial) IN (SELECT c.dividendAmount, TO_CHAR(c.effectiveDate - 5,'IYYY'), TO_CHAR(c.effectiveDate - 5,'IW'), c.tickerSerial FROM CorporateActionsV2 c WHERE c.dividendAmount IS NOT NULL AND c.eventLabel = 'Dividend' AND c.actionStatus != 'Deleted'" + " GROUP BY c.dividendAmount, TO_CHAR(c.effectiveDate - 5,'IYYY'), TO_CHAR(c.effectiveDate - 5,'IW'), c.tickerSerial HAVING COUNT(*) > 1 )") List<CorporateActionsV2> getDuplicateActions();
关键修改说明
- 移除
TO_DATE(ca.effectiveDate)和TO_DATE(c.effectiveDate):Hibernate 6支持直接对java.util.Date类型字段执行加减天数运算,会自动转换为数据库对应的日期操作(如Oracle的日期加减逻辑)。 - 保留
TO_CHAR(..., 'IYYY')和TO_CHAR(..., 'IW'):这部分用于按ISO标准格式化年份和周数,逻辑与原代码一致。
优化建议(可选)
Java 17推荐使用新日期API替代java.util.Date,将实体字段改为LocalDate可以进一步避免类型转换问题,同时适配Spring Boot 3的最佳实践:
@Column(name = "EFFECTIVE_DATE") @JsonProperty("EFFECTIVE_DATE") private LocalDate effectiveDate;
内容的提问来源于stack exchange,提问作者ahrooran
相关产品推荐
相关产品推荐

