2013-10-23 35 views
1

我在Cassandra 2.0.1中使用了Cassandra Driver 2.0.0-beta2。在BoundStatement中設置NULL值

我想將NULL值設置爲BoundStatement中'int'類型的列。我不認爲我可以用setInt。

這是我使用的代碼:

String insertStatementString = "insert into subscribers(subscriber,start_date,subscriber_id)"; 
PreparedStatement insertStatement = session.prepare(insertStatementString); 
BoundStatement bs = new BoundStatement(insertStatement); 
bs.setString("subscriber",s.getSubscriberName()); 
bs.setDate("start_date",startDate); 
bs.setInt("subscriber_id",s.getSubscriberID()); 

最後一行拋出一個空指針異常,這可能是因爲s.getSubscriberID解釋()返回一個整數,BoundStatement只接受整型,所以當id爲空時,它不能被轉換,因此是異常。

在我看來的定義應該改爲:

BoundStatement.setInt(String name, Integer v);

它是現在的樣子,我不能爲數字設置NULL值。

或者我錯過了什麼? 還有其他方法可以實現嗎?

在cqlsh中,可以將null設置爲'int'類型的列。

+0

你能添加一個較大的代碼樣品;一個包含初始化中使用的PreparedStatement? – lorcan

+0

我編輯了我的答案。 – Anakin001

回答

3

沒有必要綁定值將爲空的值或null。因此空支票可能是有用的,例如,

if(null != s.getSubscriberID()){ 
    bs.setInt("subscriber_id",s.getSubscriberID()); 
} 

至於BoundStatement的多個實例的問題,多BoundStatement的創建將與PreparedStatement S(參見the CQL documentation on prepared statements)比較便宜。因此,優點是更清楚當你開始重用PreparedStatement,例如,用環

String insertStatementString = "insert into subscribers(subscriber,start_date,subscriber_id)"; 
PreparedStatement insertStatement = session.prepare(insertStatementString); 

// Inside a loop for example 
for(Subscriber s: subscribersCollection){ 
    BoundStatement bs = new BoundStatement(insertStatement); 
    bs.setString("subscriber",s.getSubscriberName()); 
    bs.setDate("start_date",startDate); 
    if(null != s.getSubscriberID()){ 
    bs.setInt("subscriber_id",s.getSubscriberID()); 
    } 
    session.execute(bs); 
} 
+0

謝謝你的幫助。最終這也是我的方法。與PreparedStatements相比,它確實有助於瞭解創建多個BoundStatement的成本低廉。 – Anakin001

+1

從Cassandra 2.1開始,這不再是正確的:將字段未初始化會導致IllegalStateException;你應該使用BoundStatement :: setToNull(int | String)來創建一個顯式的空值。 –

0

我決定完全不設置這個值。默認情況下,它是空的。這是一個奇怪的解決方法。

但是現在我必須在每次調用之前實例化BoundStatement,因爲否則我可能會冒着與先前調用不同的值。

如果他們添加更全面的'null'支持將會很好。

相關問題