Spring cassandra Batch Operation удалить только по ключу раздела - PullRequest
1 голос
/ 07 августа 2020

У меня есть требование, в котором я должен выполнить операцию удаления в cassandra, используя только ключ разделения (удалить все записи с ключом раздела) в пакетной операции с использованием spring и springboot, но метод удаления CassandraBatchOperations принимает только введите полный объект сущности, например

CassandraBatchOperations delete(Object... entities);

, у меня есть таблица, например, table1, и у нее есть ключи: key1- partiton key, key2 -clustering key1, key 3-clustering 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, которые не имеют значений, поскольку я хочу удалить только по ключу раздела.

Я хочу знать, как я могу удалить только с помощью ключа разделения, получение списка записей из БД не является вариантом, так как я также вставляю записи в кассандру в рамках той же пакетной операции, и может случиться так, что также будет добавлена ​​запись в той же пакетной операции, которая имеет ключ раздела, который я хочу удалить ete. поэтому в этом случае, если я получу и удалю запись, новая запись, вставляемая в пакетной операции, не будет удалена.

1 Ответ

1 голос
/ 10 августа 2020

Ответом на этот вопрос был мой класс Entity, содержащий все pk (как и должно быть), поэтому, когда шаблон Cassandra создавал запрос, он собирал все ключи

Original Entity 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
    
    }

, чтобы исправить: я создал новый класс Entity с тем же именем таблицы, только с одним ключом (ключом раздела) в нем

новый класс, кроме существующий класс сущности

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

, и когда мне пришлось удалить только по ключу раздела, я передал новый класс сущности методу удаления

пакетной операции cassandra и выполненному запросу удалил запись только по ключу раздела, который присутствовал в новом классе сущности

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...