我正在尝试将我的数据库从MySQL迁移到Cassasndra。我面临的问题是其中一个列类型定义为Enum(enum(' GP',' NGP',' PGP',' PAGP& #39))。 Cassandra不支持Enum数据类型(但它支持集合)。有没有办法在Cassandra中实现Enum数据类型,因此应该从一组值中限制列的值?我使用的是Apache Cassandra 2.0.7版。
答案 0 :(得分:9)
请参阅datastax cassandra对象映射API,
http://docs.datastax.com/en/developer/java-driver/2.1/java-driver/reference/crudOperations.html
enum Gender { FEMALE, MALE };
// FEMALE will be persisted as 'FEMALE'
@Enumerated(EnumType.STRING)
private Gender gender;
// FEMALE will be persisted as 0, MALE as 1
@Enumerated(EnumType.ORDINAL)
private Gender gender
for cassandra 3.0
enum State {INIT, RUNNING, STOPPING, STOPPED}
cluster.getConfiguration().getCodecRegistry()
.register(new EnumNameCodec<State>(State.class));
// schema: create table name_example(id int PRIMARY KEY, state text)
session.execute("insert into name_example (id, state) values (1, ?)", State.INIT);
// state is saved as 'INIT'
http://docs.datastax.com/en/developer/java-driver/3.1/manual/custom_codecs/extras/
答案 1 :(得分:5)
据我所知,在阅读了有关cql类型的文档之后,你不能直接在cql语句中使用enum(我为java客户端检查了这一点)。
因此,您拥有的选项是将Enum转换为String以在cql语句中包含该字段。通过这种方式,所有应用程序都使用Enum,但在后端层使用枚举的字符串表示。
答案 2 :(得分:3)
我遇到了整数枚举的同样问题......这就是我所做的:
MappingConfiguration.Global.Define(
new[] {
new Map<Login>()
.TableName("logins")
.PartitionKey(el => el.UserId)
.Column(el => el.UserId, cm => cm.WithName("user_id")),
.Column(el => el.Gender, cm => cm.WithName("gender_id").WithDbType<int>()),
});
使用C#驱动程序2.5和DSE 4.7。
答案 3 :(得分:2)
在cassandra
中或多或少存在对枚举的本机支持http://docs.datastax.com/en/developer/java-driver/2.1/java-driver/reference/crudOperations.html
据我所知,你可以为cassandra编写自己的自定义序列化器等,它将能够理解你的特定枚举。但那些罐子应该放在cassandra文件夹中。
您也可以将其存储为String或ordinal int值