升级SpringBoot3.2后HQL中LocalDate参数类型匹配异常求助
SpringBoot 3.2(Hibernate 6.4)升级后HQL命名查询类型不匹配问题解决
核心解决方案
直接将HQL中的nvl函数替换为coalesce函数,即可解决类型不匹配问题。
原因分析
Hibernate 6.4对HQL的类型推断机制做了严格升级,nvl函数的返回类型会被推断为java.lang.Object,而你的实体属性dateFrom/dateTo是LocalDate类型,导致比较时出现类型不兼容报错。而coalesce函数会根据传入参数的类型自动保持一致的返回类型(这里就是LocalDate),能和实体属性正常比较。
修改后的HQL代码示例
String QN_GET_CONTRACT_BY_ID_AND_DATE = "ContractQuery.GET_CONTRACT_BY_ID_AND_DATE"; String GET_CONTRACT_BY_ID_AND_DATE = """ select c from ContractEntity c \ where c.id = :pId \ and c.dateFrom <= :pRefDate and :pRefDate <= coalesce(c.dateTo, :pRefDate) \ """; String QN_GET_EMPLOYMENT_BY_ID_AND_TYPE_AND_DATE = "ContractQuery.GET_EMPLOYMENT_BY_ID_AND_TYPE_AND_DATE"; String GET_EMPLOYMENT_BY_ID_AND_TYPE_AND_DATE = """ select e from EmploymentEntity e \ where e.id = :pId \ and e.employmentType = :pEmpType \ and e.dateFrom <= :pRefDate and :pRefDate <= coalesce(e.dateTo, :pRefDate) \ """;
备选方案(若coalesce不生效时)
如果替换函数后仍有问题,可以显式指定查询参数的类型,确保Hibernate能正确识别:
TypedQuery<ContractEntity> q = this.em.createNamedQuery( ContractQuery.QN_GET_CONTRACT_BY_ID_AND_DATE, ContractEntity.class); q.setParameter("pId", id); // 显式指定参数为DATE类型 q.setParameter("pRefDate", LocalDate.now(), TemporalType.DATE); List<ContractEntity> list = q.getResultList();
内容的提问来源于stack exchange,提问作者JBStonehenge
相关产品推荐
相关产品推荐

