带有轻量级事务的 Cassandra Datastax saveQuery

Abh*_*wal 3 java cassandra

我正在尝试通过 BatchStatement 将一个对象持久化到 cassandra

import com.datastax.driver.mapping.Mapper;

batch.add(mapper.saveQuery(itr.next()));
Run Code Online (Sandbox Code Playgroud)

我想要IF NOT EXISTS子句,例如

INSERT INTO customer_account (customerID, customer_email) 
VALUES (‘LauraS’, ‘lauras@gmail.com’)
IF NOT EXISTS;
Run Code Online (Sandbox Code Playgroud)

我应该如何通过 saveQuery 实现 IF NOT EXISTS?

And*_*uba 5

不幸的是,映射 API 仅支持简单的 CRUD 操作,因此在此上下文中不可能进行轻量级事务。您可以使用两种方法来解决此问题:

  1. 使用映射访问器,那么你的代码看起来像访问器接口:

    @Accessor
    public interface UserAccessor {
        @Query("INSERT INTO sandbox.user (user_id, name) VALUES (:userId, :name) IF NOT EXISTS")
        Statement insertUser(@Param("userId") UUID userId, @Param("name") String name);
    }
    
    Run Code Online (Sandbox Code Playgroud)

    代码中的某处:

    Statement statement = userAccessor.insertUser(user.getUserId(), user.getName());
    
    Run Code Online (Sandbox Code Playgroud)

    然后你可以把声明放在 BatchStatement

  2. 使用查询构建器:

    Insert insert = new QueryBuilder(cluster).insertInto("sundbox", "user")
            .value("user_id", user.getUserId())
            .value("name", user.getName())
            .ifNotExists();
    
    Run Code Online (Sandbox Code Playgroud)

    Insert是 的子类型Statement,因此您也可以将其放入BatchStatement。注意,我使用的是Driver 2.2.0,所以我使用new QueryBuilder(cluster).insertInto(...如果你使用较低版本的驱动程序,你应该使用QueryBuilder.insertInto(...