Java Datastax QueryBuilder 插入语句

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/21667425/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 09:58:23  来源:igfitidea点击:

Datastax QueryBuilder insert statement

javacassandradatastax-java-driver

提问by Adil F

What would be the right way to build a insert statement with QueryBuilder from Datastax Java Driver for Cassandra

从 Datastax Java Driver for Cassandra 使用 QueryBuilder 构建插入语句的正确方法是什么

I am using Cassandra 2.x with Java Driver 2.0.0-rc1

我使用 Cassandra 2.x 和 Java Driver 2.0.0-rc1

I know i could use a prepared statement to achieve the same but i am looking forward to using the QueryBuilder

我知道我可以使用准备好的语句来实现相同的功能,但我期待使用 QueryBuilder

@Test
public void testTableInsert() {
    Insert insert = QueryBuilder
            .insertInto(KEYSPACE_NAME, TABLE_NAME)
            .value("username", "jdoe")
            .value("first", "John")
            .value("last", "Doe");
    System.out.println(insert.toString());
    ResultSet result = session.execute(insert.toString());
    System.out.println(result);

}

I can confirm the query string is valid because it succeeds when attempting manually on cqlsh

我可以确认查询字符串有效,因为它在 cqlsh 上手动尝试时成功

INSERT INTO test.user(username,first,last) VALUES ('jdoe','John','Doe');

The error reported by the driver is

驱动报的错误是

    com.datastax.driver.core.exceptions.InvalidQueryException: unconfigured columnfamily user
    at com.datastax.driver.core.exceptions.InvalidQueryException.copy(InvalidQueryException.java:35)
    at com.datastax.driver.core.ResultSetFuture.extractCauseFromExecutionException(ResultSetFuture.java:271)
    at       com.datastax.driver.core.ResultSetFuture.getUninterruptibly(ResultSetFuture.java:187)
    at com.datastax.driver.core.Session.execute(Session.java:126)
    at com.datastax.driver.core.Session.execute(Session.java:77)
    at SimpleClientTest.testTableInsert(SimpleClientTest.java:61)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at org.junit.runners.model.FrameworkMethod.runReflectiveCall(FrameworkMethod.java:45)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:231)
    at org.junit.runners.ParentRunner.schedule(ParentRunner.java:60)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.access
public static void main(String[] Args)
{
    Cluster cluster = null;
    cluster = Cluster.builder()
                     .addContactPoint("127.0.0.1")
                     .build();
    Session session = cluster.connect();

    try
    {
        String createKS = "CREATE KEYSPACE test WITH REPLICATION = { 'class': 'SimpleStrategy', 'replication_factor': '2' }";
        session.execute(createKS);
        String query = "create table test.user (username text primary key,first text, last text);";
        session.execute(query);

        System.out.println("insert executed");
        Insert insert = QueryBuilder.insertInto("test", "user")
                                    .value("username", "jdoe")
                                    .value("first", "John")
                                    .value("last", "Doe");
        System.out.println(insert.toString());
        ResultSet result = session.execute(insert.toString());
        System.out.println(result);
    }
    catch (Exception ex)
    {
        ex.printStackTrace();
    }

    System.exit(0);
}
0(ParentRunner.java:50) at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:222) at org.junit.runners.ParentRunner.run(ParentRunner.java:300) at org.junit.runner.JUnitCore.run(JUnitCore.java:157) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:77) at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:195) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) Caused by: com.datastax.driver.core.exceptions.InvalidQueryException: unconfigured columnfamily user at com.datastax.driver.core.Responses$Error.asException(Responses.java:96) at com.datastax.driver.core.ResultSetFuture$ResponseCallback.onSet(ResultSetFuture.java:122) at com.datastax.driver.core.RequestHandler.setFinalResult(RequestHandler.java:224) at com.datastax.driver.core.RequestHandler.onSet(RequestHandler.java:359) at com.datastax.driver.core.Connection$Dispatcher.messageReceived(Connection.java:510) at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70) at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564) at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791) at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296) at org.jboss.netty.handler.codec.oneone.OneToOneDecoder.handleUpstream(OneToOneDecoder.java:70) at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564) at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791) at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296) at org.jboss.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived(FrameDecoder.java:462) at org.jboss.netty.handler.codec.frame.FrameDecoder.callDecode(FrameDecoder.java:443) at org.jboss.netty.handler.codec.frame.FrameDecoder.messageReceived(FrameDecoder.java:303) at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70) at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564) at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:559) at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268) at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255) at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88) at org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:109) at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:312) at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:90) at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178) at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108) at org.jboss.netty.util.internal.DeadLockProofWorker.run(DeadLockProofWorker.java:42) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) at java.lang.Thread.run(Thread.java:695)

I couldn't find any examples on the official documentation page at here

我在此处的官方文档页面上找不到任何示例

采纳答案by Lyuben Todorov

You just forgot to create the keyspace.

您只是忘记创建密钥空间。

Full code used to create a KS, create a CF and use the querybuilder to insert a partition.

用于创建 KS、创建 CF 和使用查询构建器插入分区的完整代码。

QueryBuilder.insertInto(String.format("\"%s\"", COLUMN_FAMILY)).…

回答by Adil F

There is no problem in the code. The error is due to the fact that the CF being queried was created in the same session. In such a case, one needs to create a new Session to the cluster for the Session to get the TableMetaData about the CF. I just assumed that since a connection was established, the Session would update its TableMetaData before a Insert statement. Unfortunately not the case.

代码没有问题。该错误是由于被查询的 CF 是在同一会话中创建的。在这种情况下,需要为集群创建一个新的 Session,以便 Session 获取有关 CF 的 TableMetaData。我只是假设由于建立了连接,Session 将在 Insert 语句之前更新其 TableMetaData。不幸的是,情况并非如此。

回答by Bombe

I just had the same problem but arrived at a different solution. In my case I had an integration test, running multiple tests against a Cassandra instance; four tests (not using batches) succeeded flawlessly, a fifth (using batches) failed.

我只是遇到了同样的问题,但得出了不同的解决方案。就我而言,我有一个集成测试,针对 Cassandra 实例运行多个测试;四次测试(不使用批次)完美成功,第五次(使用批次)失败。

For some reason the CQL parser converts all names to lower-case so if you have a keyspace or column family name with mixed case letters you have to surround the name of the keyspace or column family with quotes, i.e.

由于某种原因,CQL 解析器将所有名称转换为小写,因此如果您有一个混合大小写字母的键空间或列族名称,您必须用引号将键空间或列族的名称括起来,即

##代码##