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
相关产品推荐
相关产品推荐

