在spring converter中将“null”转换为某个值

ycggw6v2  于 2021-06-13  发布在  Cassandra
关注(0)|答案(0)|浏览(371)

数据库(cassandra)不允许在添加新列时指定默认值。因此,需要新列 null 每行。
现在,我们为实体添加了一个标志(将来可能会获得更多条目):

enum UsageFlag {
    OTHER,
    SPECIAL_VALUE,
}

我们还添加了readingconverter:

@ReadingConverter
public class UsageFlagReadingConverter implements Converter<String, UsageFlag> {
  @Nonnull
  @Override
  public UsageFlag convert(String source) {
    return source == null
        ? UsageFlag.OTHER
        : UsageFlag.valueOf(source);
  }
}

它应该基本上 null 作为 UsageFlag.OTHER 将任何其他非空值解析为枚举成员时。
但是,这不起作用,因为根据spring文档,转换器的convert方法只有在值不存在时才被调用 null . 因此,该实体的字段保持不变 null 如果是的话 null 在数据库里。如果(并且仅当)有一个值,它就可以正常工作。因为在创建整个列时它是空的,所以这完全违背了 ReadingConverter .
cassandra似乎不支持为每一行设置一个值(比如 UPDATE foo SET flag='OTHER' WHERE True ),所以这看起来是个不错的选择。我们希望避免手动接触数据库中的每一行。
在这种情况下,我们有没有办法用spring来帮忙?或者有没有办法用cql或者cassandra来解决这个问题?
编辑:有关设置的更多上下文:

public interface FancyEntityRepository extends MapIdCassandraRepository<FancyEntity> {
}

public class FancyEntity {
    @PrimaryKeyColumn(name = "id", ordinal = 0, type = PrimaryKeyType.PARTITIONED)
    private string id;
    private UsageFlag usage;
    // other columns omitted
    // getters and setter omitted for this example
}

// Somewhere in a service: 
FancyEntity fe = fancyEntityRepository.findOne("1");
System.out.println(fe.getUsage());

但我不认为转换器的行为是Cassandra特有的。
表是这样创建和更改的:

CREATE TABLE FancyEntity (
    id TEXT,
    -- other columns omitted
    PRIMARY KEY (id)
);
ALTER TABLE FancyEntity ADD (
    usage TEXT
);

cassandra记录了alter table和一个关于用默认值修改表的相关so问题。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题