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
我有一个要求,我必须在使用 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