我正在使用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'类型的列。
答案 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,否则我冒着与之前调用中的值不同的风险。
如果他们增加了更全面的“空”支持,那将会很棒。