当前位置: 首页 > 知识库问答 >
问题:

在卡桑德拉中使用一组值的预准备语句

奚光霁
2023-03-14

我使用的是datastax Cassandra 2.0驱动程序,我在使用预先准备好的绑定语句。假设我想查询如下内容:

SELECT * FROM foo WHERE mykey IN (UUID1, UUID2, UUID3);

其中,UUID1、UUID2、UUID3是UUID值。使用绑定语句实现这一点的编程方法是什么?目前,我正在尝试以下方法:

preparedStatement = session.prepare("SELECT * FROM foo WHERE vref IN ?")
boundStatement = new BoundStatement(preparedStatement)

val uuids: java.util.ArrayList[java.util.UUID] = //assume we're getting the values from somewhere
session.execute(boundStatement.bind(uuids))

这当前返回了错误的结果。如何正确格式化查询有何建议?

共有1个答案

薄烨
2023-03-14

下面是一个使用简单表格和文本值的示例。使用Centos 6.5和DSE4.5.1

我的桌子:

DESCRIBE TABLE deleteme1 ;

CREATE TABLE deleteme1 (
  col1 text,
  col2 text,
  PRIMARY KEY ((col1))
) WITH
  bloom_filter_fp_chance=0.010000 AND
  caching='KEYS_ONLY' AND
  comment='' AND
  dclocal_read_repair_chance=0.100000 AND
  gc_grace_seconds=10000 AND
  index_interval=128 AND
  read_repair_chance=0.000000 AND
  replicate_on_write='true' AND
  populate_io_cache_on_flush='false' AND
  default_time_to_live=0 AND
  speculative_retry='99.0PERCENTILE' AND
  memtable_flush_period_in_ms=0 AND
  compaction={'class': 'SizeTieredCompactionStrategy'} AND
  compression={'sstable_compression': 'LZ4Compressor'};

我的数据:

cqlsh:results> select * from deleteme1 ;

 col1  | col2
-------+-------
 three | three
   one |   one
   two |   two
  four |  four

(4 rows)

我的示例测试类

import java.util.ArrayList;

import com.datastax.driver.core.BoundStatement;
import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.PreparedStatement;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.Session;


public class PrepStatement {
    Cluster cluster;
    Session session;

    public static void main(String args []){
        PrepStatement myTest = new PrepStatement();
        String node = "192.168.56.22";
        myTest.runTest(node);
        myTest.close();

    }

    private void runTest(String node){
        ArrayList<String> vals = new ArrayList<String>(2);
        vals.add("one");
        vals.add("three");

        try {
            cluster = Cluster.builder()
                    .addContactPoint(node)
                    //.withCredentials("cassandra", "cassandra") // only if you need a login
                    .build();
            session = cluster.connect();
            PreparedStatement preparedStatement = session.prepare("SELECT * FROM results.deleteme1 WHERE col1 IN ?");
            BoundStatement boundStatement = new BoundStatement(preparedStatement);
            ResultSet results = session.execute(boundStatement.bind(vals));
            for (Object result : results){
                System.out.println(result.toString());
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }

    }

    /**
     * cleans up the session
     */
    private void close() {  
        session.close();
        cluster.close();
    }
}

最后..以下是输出结果:

Row[one, one]
Row[three, three]

注意只能对作为主键列的列使用IN查询,如以下CQL3.0文档所述:http://www . datas tax . com/documentation/cql/3.0/cql/cql _ reference/select _ r . html

 类似资料:
  • 我需要一些帮助来定义使用Cassandra的数据堆垛对象映射器和使用预准备语句的常见解决方案之间的区别。而不是代码将对象映射到POJO类会更干净,在性能等方面还有其他优点。.感谢您的回答。

  • 由于基础设施的限制,我们无法将运行的Cassandra版本升级到 Cassandra现在抛出一个 在这种情况下,最好的解决方法是什么?大多数指南告诉我们简单地使用< code>UNSET:(。

  • 我相信我已经在Cassandra csharp驱动程序(版本2.7.3)的StatementFactory中发现了一个关于如何缓存准备好的语句的逻辑的bug。下面是使用案例。 我们发现,运行此删除后,只有第一个请求成功。在深入了解StatementFactory的源代码之后 您可以看到缓存仅使用 cql 语句。在我们的例子中,我们在不同的键空间(又名会话)中具有相同的表名。两个查询中的 cql 语

  • 我正在使用Cassandra作为我的一个应用程序。我想使用Cassandra通过cql提供的Prepared语句。如果我准备了一个查询,这是否在所有节点中都准备好了?。 任何帮助是值得赞赏的。

  • 我们对DataStax Cassandra的查询使用缓存的准备声明。但是,如果我们需要向表中添加新列,我们需要重新启动应用程序服务器以重新缓存准备好的语句。 我在卡珊德拉遇到了这个错误,这解释了https://datastax-oss.atlassian.net/browse/JAVA-420的解决方案 它基本上提供了一种解决方法,在查询中不使用“SELECT*FROM table”,而是使用“s

  • 我已经开始使用DataTax PHP驱动程序学习PHP中的Cassandra,我必须使用准备好的语句在CQL中设置映射的值,查询是: 提交的“属性”是MAP类型,因此我尝试将其作为字符串传递: 在PHP中: 但是我得到了错误“java.lang.IllegalArgumentException”,对于准备好的语句中的映射或列表之类的集合,哪种语法是正确的?