使用轻量级事务的Cassandra Datastax saveQuery

时间:2015-09-25 14:23:03

标签: java cassandra

我正试图通过BatchStatement

将对象持久化到cassandra
import com.datastax.driver.mapping.Mapper;

batch.add(mapper.saveQuery(itr.next()));

我想要 IF NOT EXISTS 子句,如

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

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

1 个答案:

答案 0 :(得分:4)

不幸的是,映射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);
    }
    

    代码中的某个地方:

    Statement statement = userAccessor.insertUser(user.getUserId(), user.getName());
    

    然后你可以在BatchStatement

  2. 中加上陈述
  3. 使用查询构建器:

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

    InsertStatement的子类型,因此您也可以将其放在BatchStatement中。请注意,我使用Driver 2.2.0,因此我使用new QueryBuilder(cluster).insertInto(...如果您使用较低的驱动程序版本,则应使用QueryBuilder.insertInto(...