1

Cassandra 2.0.1 で Cassandra Driver 2.0.0-beta2 を使用しています。

BoundStatement で 'int' 型の列に NULL 値を設定したいと考えています。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());

最後の行は null ポインター例外をスローします。これは、s.getSubscriberID() が Integer を返し、BoundStatement が int のみを受け入れるため説明できます。そのため、id が null の場合は変換できず、例外になります。

私の意見では、定義は次のように変更する必要があります。

BoundStatement.setInt(String name, Integer v);

今のやり方では、数値に NULL 値を設定することはできません。

または、何か不足していますか?これを達成する他の方法はありますか?

cqlsh では、「int」型の列に null を設定できます。

4

2 に答える 2

4

値が空または になる値をバインドする必要はありませんnull。したがって、null チェックが役立つ場合があります。

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

BoundStatement の複数のインスタンス化の問題に関しては、複数の作成はsBoundStatementと比較して安価になります(準備済みステートメントに関する CQL ドキュメントをPreparedStatement参照してください)。したがって、たとえばループを使用して を再利用し始めると、利点がより明確になります。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 をインスタンス化する必要があります。そうしないと、前の呼び出しとは異なる値になるリスクがあるからです。

より包括的な「null」サポートが追加されれば素晴らしいことです。

于 2013-10-23T11:44:20.147 に答える