由於id
和name
是你永遠需要他們兩人的搜索複合分區鍵的一部分。所以你可以把你的JSON和名單列爲幾個選擇查詢或使用IN
。
推薦的解決方案
使用在同一時間兩個不同的SELECT查詢然後彙總這使得結果中的每個選擇打的最好節點假設你使用TokenAware。
我使用RxJava展開許多請求,然後將它們合併回行列表。
public class CassandraService {
//...
public void run() {
String id = "1";
List<String> names = ['abc','xyz'];
PreparedStatement selectStmt = session.prepare("SELECT id, name, value FROM table WHERE id=? AND name=?;");
List statements = new ArrayList<Statement>();
for(String name : names) {
statements.add(selectStmt.bind(id,name));
}
Observable<Row> rows = execute(statements);
//Do work with rows.
}
public Observable<ResultSet> executeAndReturnResultSet(Statement statement) {
return Observable.from(session.executeAsync(statement));
}
public Observable<Row> execute(List<Statement> statements) {
List<Observable<ResultSet>> resultSets = Lists.transform(statements, this::executeAndReturnResultSet);
return Observable.merge(resultSets).flatMap(Observable::from);
}
}
替代
否則,你可以使用IN
類似下面的CQL:
SELECT * FROM multi_partition_key WHERE id='1' AND name IN ('abc','xyz');
結合在Java驅動程序一份準備好的聲明。
String id = "1";
List<String> names = ['abc','xyz'];
PreparedStatement sel = session.prepare("SELECT id, name, value FROM table WHERE id=? AND name IN ?;");
session.execute(sel.bind(id,name));
感謝傑夫的快速響應。我搜索了互聯網,發現使用IN子句會降低性能。 – Sandy
有沒有其他的選擇我們可以使用? – Sandy
是的,在我的回答中,我推斷的方法是一次發送兩條select語句。 –