2015-09-25 72 views
3

我試圖通過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?

回答

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. 使用查詢生成器:

    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 –