卡桑德拉Datastax saveQuery与轻型交易

问题描述:

我试图通过BatchStatement卡桑德拉Datastax saveQuery与轻型交易

import com.datastax.driver.mapping.Mapper; 

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

坚持一个目标是卡桑德拉和我想有IF NOT EXISTS条款像

INSERT INTO customer_account (customerID, customer_email) 
VALUES (‘LauraS’, ‘[email protected]’) 
IF NOT EXISTS; 

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

不幸的是,映射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. 使用查询生成器:

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

    InsertStatement一个亚型,所以你可以把它放在BatchStatement为好。取到的注意,我用的驱动程序2.2.0,所以我用new QueryBuilder(cluster).insertInto(...在这种情况下,如果你使用较低版本的驱动程序,你应该使用IM“ifNotExists()”使用QueryBuilder.insertInto(...

+0

INSERT语句我” m看到错误“com.datastax.driver.core.exceptions.UnavailableException:没有足够的副本可用于查询一致性QUORUM(2个必需但只有1个活动)”,它不会在删除''ifNotExists()'时出现。我正在使用datastax驱动程序2.1.7。 –

+0

如果您使用轻量级事务,则需要使用准确的复制因子。如果只有一个节点,请将keyspace的'replication_factor'更改为1 –