Hibernate映射LocalDate到SQL Date时出现Undefined filter parameter报错
报错原因
该报错核心是Hibernate无法匹配过滤器参数的类型定义,具体诱因有两个:
@ParamDef中定义的type="date"默认映射的是java.sql.Date类型,而非你传入的java.time.LocalDate类型。即使Hibernate 5.5支持Java 8时间API,你没有显式指定参数类型为LocalDate的情况下,Hibernate会认为传入的参数类型和定义不匹配,进而抛出参数未定义的异常。- 小概率为你的实体类没有被Hibernate正确扫描到,
@FilterDefs的配置未生效。
解决方案
按优先级依次尝试以下操作:
- 修改过滤器参数的类型定义
将@FilterDef中两个日期相关参数的type从date改为LocalDate(Hibernate内置的Java 8时间类型别名),修改后的代码如下:
@FilterDefs({ @FilterDef(name="priceFilter", parameters=@ParamDef(name="priceComparison",type="double")), @FilterDef(name="beforeDateFilter", parameters=@ParamDef(name="beforeDateLocal", type="LocalDate")), @FilterDef(name="afterDateFilter", parameters=@ParamDef(name="afterDateLocal", type="LocalDate")) })
如果修改后仍报错,可以替换为全限定类名:type = "java.time.LocalDate"。
检查实体类配置
确认你的listing实体类上的@Entity注解生效,项目的Hibernate包扫描路径包含该实体类所在的包,避免过滤器配置未被加载。(可选不推荐)适配旧类型定义
如果你不想修改过滤器配置,可以将传入的LocalDate转换为java.sql.Date再设置参数:
afterDateFilter.setParameter("afterDateLocal", java.sql.Date.valueOf(afterDateLocal));
内容的提问来源于stack exchange,提问作者noumenal
相关产品推荐
相关产品推荐

