gpt4 book ai didi

java - 关于具有多个属性的 Cassandra java BoundStatement 的查询

转载 作者:行者123 更新时间:2023-12-01 09:21:30 24 4
gpt4 key购买 nike

我正在尝试使用 BoundStatement 的绑定(bind)方法从 Cassandra 获取记录,然后对其执行 session.execute 。假设 json 如下所示

{
id:1,
name:abc,
.
.
.
}

在这里,如果我想使用多列(id=1和name=abc)进行查询,我能够成功获取记录。

但是,我的 json 看起来像这样:

{
id:1
name:["abc","xyz"]
.
.
.
}

在数据库中,它保存在两个不同的行中(因为有与名称属性关联的值列表)

问题是如何从数据库中获取记录?

P.S.:id和name是复合分区键

最佳答案

由于 idname 是复合分区键的一部分,因此您始终需要通过它们进行搜索。因此,您可以获取 JSON 并将姓名列表扇出到几个选定的查询中或使用 IN

推荐解决方案

同时使用两个不同的 SELECT 查询,然后聚合结果,这允许每个 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');

用于绑定(bind)到 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));

关于java - 关于具有多个属性的 Cassandra java BoundStatement 的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40140126/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com