2016-06-07 15 views
0

假設我在Cassandra中有一個表,其中有一個名爲map1的地圖字段(map<int, text>)。我想執行以下語句: SELECT * from TABLE1 WHERE map1 = ? 創建PreparedStatement的實例後,我需要在其上調用bind,併爲?佔位符的有效值。我怎樣才能做到這一點?Cassandra:如何將PreparedStatement綁定到地圖數據中

這是我的不完整代碼: PreparedStatement stmt = session.prepare("SELECT * from TABLE1 WHERE map1 = ?"); session.execute(stmt.bind(?));

附:假設我已經啓用「允許過濾」

回答

1

的bindmarker ?位置佔位和位置是從零開始的,所以第一個bindmarker獲取索引0等。可以以兩種方式結合進行該佔位符的值:

  1. 使用BoundStatement.setMap(int, Map)方法:

    BoundStatement bs = stmt.bind(); 
    Map<Integer, String> map1 =... 
    bs.setMap(0, map1); // 0 is the zere-based index of your bindmarker 
    
  2. 使用PreparedStatement.bind(Object...)方法,該方法本質上是一個短手上面的代碼;每個參數必須對應一個位置bindmarker查詢:

    Map<Integer, String> map1 =... 
    BoundStatement bs = stmt.bind(map1); 
    

最後,因爲你的列是map<int,text>類型,司機很自然地映射它在Java中Map<Integer, String>。這就是爲什麼你應該使用BoundStatement中的setMap()方法。

+0

謝謝。爲了記錄,最後我不得不切換到「CONTAINS」和「CONTAINS KEY」以查詢地圖字段。因此,我只需要綁定地圖的鍵/值的簡單值,而不綁定完整的地圖。 – mahdix

相關問題