You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 06:33:26