在BoundStatement中设置NULL值

时间:2013-10-23 06:58:43

标签: cassandra datastax-java-driver

我正在使用Cassandra Driver 2.0.0-beta2和Cassandra 2.0.1。

我想在BoundStatement中将NULL值设置为'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()返回一个Integer并且BoundStatement只接受整数,所以当id为null时,它无法转换,因此异常。

我认为该定义应改为:

BoundStatement.setInt(String name, Integer v);

现在的方式,我不能为数字设置NULL值。

或者我错过了什么? 还有其他方法可以达到这个目的吗?

在cqlsh中,可以将null设置为'int'类型的列。

2 个答案:

答案 0 :(得分:4)

无需绑定值为空或null的值。因此,空检查可能很有用,例如,

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

对于BoundStatement的多个实例化问题,与BoundStatement相比,创建多个PreparedStatement会更便宜(参见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);
}

答案 1 :(得分:0)

我决定不设置值。默认情况下,它为null。这是一个奇怪的解决方法。

但是现在我必须在每次调用之前实例化BoundStatement,否则我冒着与之前调用中的值不同的风险。

如果他们增加了更全面的“空”支持,那将会很棒。