我正在尝试通过BatchStatement将对象保留为cassandra

import com.datastax.driver.mapping.Mapper;

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

而且我想要如果不存在子句,例如
INSERT INTO customer_account (customerID, customer_email)
VALUES (‘LauraS’, ‘[email protected]’)
IF NOT EXISTS;

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

最佳答案

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

  • 使用映射访问器,那么您的代码看起来像
    访问器接口:
    @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
  • 使用查询生成器:
    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(...
  • 10-07 13:51