Spring Data JPA枚举查询报错:Unknown name value []问题求助
问题分析与解决方案
问题根源
错误提示明确说明:Hibernate尝试将空字符串([])转换为PROG_STATUS枚举时失败,因为你的枚举类中没有定义对应空字符串的枚举值。这意味着数据库中prog_status字段存在空字符串('')的记录——虽然你的SQL里包含了rtl.progStatus is null的条件,但如果数据库里存储的是''而非NULL,这条条件不会生效,查询结果仍会带回空字符串的记录,最终触发枚举转换异常。
解决方案
1. 修正数据库脏数据(优先推荐)
直接检查并清理数据库中real_time_update_log表的prog_status字段:
- 查找所有空字符串的记录:
SELECT * FROM real_time_update_log WHERE prog_status = ''; - 将这些记录的
prog_status更新为NULL或合法枚举值(INPROGRESS/SUCCESS/FAILURE):UPDATE real_time_update_log SET prog_status = NULL WHERE prog_status = '';
2. 自定义枚举转换器处理空值
如果无法修改数据库数据,或需要兼容历史空字符串数据,可以通过自定义JPA属性转换器,让Hibernate自动将空字符串转换为NULL:
import javax.persistence.AttributeConverter; import javax.persistence.Converter; @Converter(autoApply = true) public class ProgStatusConverter implements AttributeConverter<RealTimeUpdateLog.PROG_STATUS, String> { // 实体转数据库字段:空枚举转为NULL @Override public String convertToDatabaseColumn(RealTimeUpdateLog.PROG_STATUS status) { return status == null ? null : status.name(); } // 数据库字段转实体:空字符串/NULL转为NULL枚举 @Override public RealTimeUpdateLog.PROG_STATUS convertToEntityAttribute(String dbData) { if (dbData == null || dbData.trim().isEmpty()) { return null; } return RealTimeUpdateLog.PROG_STATUS.valueOf(dbData); } }
然后在实体类的枚举字段上添加转换器注解:
@Enumerated(EnumType.STRING) @Convert(converter = ProgStatusConverter.class) private PROG_STATUS progStatus;
3. 临时调整SQL查询条件
如果只是临时绕过问题,可以修改SQL条件,排除空字符串的记录:
@Query("select rtl from RealTimeUpdateLog rtl, RealTimeUpdateLog prtl where rtl.orderId=prtl.orderId and" + " prtl.customerId=?1 and prtl.seq+1=?2 and prtl.syncCompleted=true and (rtl.progStatus <>?4 or rtl.progStatus is null or rtl.progStatus = '') and rtl.customerId=?1 and rtl.seq=?2 and rtl.syncCompleted=false and rtl.retryCount>=0 and rtl.retryCount<=?3") List<RealTimeUpdateLog> findAllIfPreviousSyncedByOrder(Long customerId, int seq, int retryCount, PROG_STATUS progStatus);
注意:这只是临时方案,无法从根本解决数据不规范的问题。
内容的提问来源于stack exchange,提问作者AppleT
相关产品推荐
相关产品推荐

