1

我将 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只接受int,所以当id为null时,无法转换,因此出现异常。

在我看来,定义应该改为:

BoundStatement.setInt(String name, Integer v);

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

还是我错过了什么?还有其他方法可以实现这一目标吗?

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

4

2 回答 2

4

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

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

至于 BoundStatement 的多个实例化的问题,BoundStatement与 s 相比,创建 multiple 会更便宜PreparedStatement(请参阅CQL 文档上的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);
}
于 2013-10-24T10:23:40.150 回答
0

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

但是现在我必须在每次调用之前实例化 BoundStatement,否则我可能会面临与先前调用不同的值的风险。

如果他们添加更全面的“空”支持,那就太好了。

于 2013-10-23T11:44:20.147 回答