Spring cassandra 批量操作仅通过分区键删除

Spring cassandra Batch Operation delete by partition key only

我有一个要求,我必须在使用 spring 和 springboot 的批量操作下仅使用分区键(删除所有带有分区键的记录)在 cassandra 中执行删除操作,但是 CassandraBatchOperations 的 delete 方法只接受输入的完整实体对象,如

CassandraBatchOperations delete(Object... entities);

我有一个 table 说 table1 它有钥匙: key1- 分区键, key2 -聚类 key1 , key 3 聚类 key2

so my requirement is that in batch operation below query should run
DELETE from table1 where key1='input key';


so when i create an object like 
tableEntity recordToDelete=new Table1Entity();
recordToDelete.setKey1('input key');

and run batchOperations like 
CassandraBatchOperations batchOps=cassandraTemplate.batchOps();
batchOps.delete(recordToDelete);

then the effective query getting generated is 
DELETE from table1 where key1='input key' and key2=null and key3=null

然后我就低于异常

>  rg.springframework.data.cassandra.CassandraInvalidQueryException: 
> Query; CQL [BEGIN BATCH DELETE FROM table1 WHERE key2=null AND
> key3=null AND key1='0002';APPLY BATCH;]; Invalid null value in
> condition for column key2; nested exception is
> com.datastax.driver.core.exceptions.InvalidQueryException: Invalid
> null value in condition for column key2

问题是正在创建的查询也在考虑集群键 key2 和 key3,它们没有值,因为我只想通过分区键删除。

我想知道如何只通过partiton Key删除, 从 DB 获取记录列表不是一个选项,因为我也在同一批次操作下在 cassandra 中插入记录,并且可能会发生在同一个批次操作中也有一条记录被插入,它具有我想要的分区键删除 。所以在那种情况下,如果我获取并删除记录,则在批处理操作中插入的新记录将不会被删除。

这个问题的答案是我的实体 class 包含所有 pk(它应该) 因此,当 Cassandra 模板创建查询时,它会拾取所有键

原始实体class

@Table(CassandraDBSchemaConstants.TABLE1)
public class Table {
    @PrimaryKeyColumn (name = CassandraDBSchemaConstants.KEY1 , type = PrimaryKeyType.PARTITIONED)
    private String key1;
    
    @PrimaryKeyColumn(name = CassandraDBSchemaConstants.KEY2 , type = PrimaryKeyType.CLUSTERED)
    private String key2;
    
    @PrimaryKeyColumn(name = CassandraDBSchemaConstants.KEY3 , type = PrimaryKeyType.CLUSTERED)
    private String key3;
    
    
    ..//other columns
    
    }

所以作为修复:我创建了一个新的实体 class 具有相同的 table 名称,其中只有 1 个键(分区键)

与现有实体 class

不同的新 class
@Table(CassandraDBSchemaConstants.TABLE1)
public class TableOnlyByPartitonKey {
    @PrimaryKeyColumn (name = CassandraDBSchemaConstants.KEY1 , type = PrimaryKeyType.PARTITIONED)
    private String key1;
    
    }

当我不得不通过分区键删除时,我将新实体 class 传递给了 cassandra 批处理操作的删除方法

并且执行的查询仅通过新实体中存在的分区键删除了记录 class