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

Spring Data Cassandra如何为Enum类型列自定义转换器实现指定值存储

实现方案

步骤1:修正枚举类的基础配置

首先需要给枚举字段补充Getter方法,方便转换器读取value值,同时补充根据value反向查找枚举实例的工具方法,修正后代码如下:

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public enum SomeEnum {
    SOMETHING (1,"ABC","xxx","yyy"),
    SOMETHING_ELSE (2,"DEF","zzz","aaa"),
    SOMETHING_ELSE_2 (3,"GHI","yyy","bbb");

    final int val1;
    final String value;
    final String val2;
    final String val3;

    // 反向查找枚举的工具方法,给读转换器使用
    public static SomeEnum getByValue(String value) {
        for (SomeEnum enumItem : values()) {
            if (enumItem.getValue().equals(value)) {
                return enumItem;
            }
        }
        throw new IllegalArgumentException("未匹配到对应的SomeEnum枚举,值为:" + value);
    }
}

步骤2:编写自定义转换器

需要分别实现写转换器(枚举转Cassandra TEXT类型,用于数据写入)和读转换器(Cassandra TEXT转枚举,用于数据查询):

import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.ReadingConverter;
import org.springframework.data.convert.WritingConverter;

// 写转换器:写入数据库时取枚举的value字段值作为存储内容
@WritingConverter
public class SomeEnumWriteConverter implements Converter<SomeEnum, String> {
    @Override
    public String convert(SomeEnum source) {
        return source.getValue();
    }
}

// 读转换器:从数据库查询时,根据存储的字符串反向匹配枚举实例
@ReadingConverter
public class SomeEnumReadConverter implements Converter<String, SomeEnum> {
    @Override
    public SomeEnum convert(String source) {
        return SomeEnum.getByValue(source);
    }
}

步骤3:注册转换器到Spring Cassandra配置

把自定义转换器加入Cassandra的转换规则列表,Spring Boot环境下配置方式如下:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.cassandra.core.convert.CassandraCustomConversions;
import java.util.List;

@Configuration
public class CassandraCustomConfig {
    @Bean
    public CassandraCustomConversions cassandraCustomConversions() {
        return new CassandraCustomConversions(List.of(
                new SomeEnumWriteConverter(),
                new SomeEnumReadConverter()
        ));
    }
}

配置完成后无需修改原有实体类的字段注解,持久化时mycolumn列会自动存储枚举的value字段值,查询时也会自动把字符串映射为对应的枚举实例。

内容的提问来源于stack exchange,提问作者ThrowableException

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:21:03