2016-06-07 11 views
0

Angenommen, ich habe eine Tabelle in Cassandra mit einem Kartenfeld (map<int, text>) mit dem Namen map1. Und ich möchte diese Anweisung ausführen: SELECT * from TABLE1 WHERE map1 = ? Nach dem Erstellen einer Instanz von PreparedStatement, muss ich bind darauf mit einem gültigen Wert für ? Platzhalter aufrufen. Wie kann ich das machen?Cassandra: So binden Sie PreparedStatement an Kartendaten

Das ist mein unvollständig Code: PreparedStatement stmt = session.prepare("SELECT * from TABLE1 WHERE map1 = ?"); session.execute(stmt.bind(?));

P. S. Angenommen, ich habe „LASSEN Filtering“ aktiviert

Antwort

1

Die bindmarker ? ist ein Positions Platzhalter und Positionen sind Null-basiert, so dass der erste bindmarker bekommt den Index 0 und so weiter. Sie können einen Wert für dieses Platzhalter auf zwei Arten binden:

  1. die BoundStatement.setMap(int, Map) Methoden:

    BoundStatement bs = stmt.bind(); 
    Map<Integer, String> map1 =... 
    bs.setMap(0, map1); // 0 is the zere-based index of your bindmarker 
    
  2. Verwenden der PreparedStatement.bind(Object...) Verfahren, das oben im wesentlichen eine Kurz Hand für den Code ist; jedes Argument muss auf eine Positions bindmarker in der Abfrage entsprechen:

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

Und schließlich, weil Ihre Spalte vom Typ ist map<int,text>, der Fahrer natürlich ordnet sie in Java zu Map<Integer, String>. Deshalb sollten Sie die Methode setMap() in BoundStatement verwenden.

+0

Danke. Nur zur Information, schließlich musste ich zu "CONTAINS" und "CONTAINS KEY" wechseln, um das Kartenfeld abzufragen. Als Ergebnis musste ich nur einfache Werte für Schlüssel/Wert der Map binden und keine komplette Map binden. – mahdix