Spring Data Cassandra Insert创建单元格墓碑

时间:2017-03-24 00:26:25

标签: cassandra spring-data spring-data-cassandra

我使用Spring Boot 1.5.1.RELEASE和spring-boot-starter-data-cassandra。

我遇到了一个我正在使用CassandraOperations.insert的问题,它导致了一堆单元格的墓碑。这似乎是由https://jira.spring.io/browse/DATACASS-182引起的。由于Spring Data现在为空值插入实际的null,因此会导致单元格的逻辑删除。我还没有找到任何方法告诉Spring Data不这样做。是否有配置或其他我可以说"对于此插入,不要插入实际的空值"?

2 个答案:

答案 0 :(得分:0)

目前这是Spring Data Cassandra的限制。我已创建https://jira.spring.io/browse/DATACASS-420来跟踪此情况。我暂时解决的问题是创建一个扩展MappingCassandraConverter的自定义类,并重写writeInsertFromWrapper方法以不插入空值。

答案 1 :(得分:0)

最简单且非侵入式的解决方案之一就是使用

CassandraTemplate.insert()/CassandraBatchOperations.insert()

基本上,当生成的CQL具有显式的空值时,将创建逻辑删除。例如,以下查询将插入一个墓碑。

Insert into KeyspaceName.TableName(ColumnName1, ColumnName2, ColumnName3)
values (Column1Value, Column2Value, null)

Cassandra将insert视为upsert,并且对于每个null,它将尝试删除现有的列值,而不执行是否检查列值是否存在的检查。因此,对于每个空值,它都会创建一个逻辑删除,这意味着该值已被删除。

但是,以下查询不会创建逻辑删除。

Insert into KeyspaceName.TableName(ColumnName1, ColumnName2)
values (Column1Value, Column2Value)

CassandraTemplate.insert()/CassandraBatchOperations.insert()生成的查询将忽略具有空值的列,并生成具有非空值的列的CQL。因此不会创建墓碑。