spring cassandra批处理操作只按分区键删除

cwxwcias  于 2021-06-13  发布在  Cassandra
关注(0)|答案(1)|浏览(380)

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

  1. CassandraBatchOperations delete(Object... entities);

我有一个表,比如table1,它有键:key1-partiton键,key2-clustering键1,key3-clustering键2

  1. so my requirement is that in batch operation below query should run
  2. DELETE from table1 where key1='input key';
  3. so when i create an object like
  4. tableEntity recordToDelete=new Table1Entity();
  5. recordToDelete.setKey1('input key');
  6. and run batchOperations like
  7. CassandraBatchOperations batchOps=cassandraTemplate.batchOps();
  8. batchOps.delete(recordToDelete);
  9. then the effective query getting generated is
  10. DELETE from table1 where key1='input key' and key2=null and key3=null

那我就到下面去了

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

问题是获取create的查询还考虑了集群键key2和key3,它们没有值,因为我只想按分区键删除。
我想知道如何只通过partiton键删除,从db中获取记录列表不是一个选项,因为我还在cassandra中插入同一批操作下的记录,并且可能发生的情况是,在同一批操作中也有一个记录被插入,它具有我要删除的分区键。因此,在这种情况下,如果我获取并删除记录,那么在批处理操作中插入的新记录将不会被删除。

aiqt4smr

aiqt4smr1#

这个问题的答案是我的实体类包含了所有的pk(正如它应该包含的那样),所以当cassandra模板创建查询时,它会获取所有的键
原始实体类

  1. @Table(CassandraDBSchemaConstants.TABLE1)
  2. public class Table {
  3. @PrimaryKeyColumn (name = CassandraDBSchemaConstants.KEY1 , type = PrimaryKeyType.PARTITIONED)
  4. private String key1;
  5. @PrimaryKeyColumn(name = CassandraDBSchemaConstants.KEY2 , type = PrimaryKeyType.CLUSTERED)
  6. private String key2;
  7. @PrimaryKeyColumn(name = CassandraDBSchemaConstants.KEY3 , type = PrimaryKeyType.CLUSTERED)
  8. private String key3;
  9. ..//other columns
  10. }

所以作为修复:我创建了一个新的实体类,它的表名相同,只有一个键(分区键)
现有实体类之外的新类

  1. @Table(CassandraDBSchemaConstants.TABLE1)
  2. public class TableOnlyByPartitonKey {
  3. @PrimaryKeyColumn (name = CassandraDBSchemaConstants.KEY1 , type = PrimaryKeyType.PARTITIONED)
  4. private String key1;
  5. }

当我只需要按分区键删除时,我将新的实体类传递给cassandra批处理操作的delete方法
执行的查询仅通过新实体类中的分区键删除记录

展开查看全部

相关问题