首页 文章

Datastax QueryBuilder插入语句

提问于
浏览
3

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

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

我知道我可以使用预准备语句来实现相同的目标,但我期待着使用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);

}

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

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

驱动程序报告的错误是

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$1.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$3.run(ParentRunner.java:231)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
    at org.junit.runners.ParentRunner$2.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$1.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)

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

3 回答

  • 3

    你只是忘了创建键空间 .

    用于创建KS,创建CF并使用querybuilder插入分区的完整代码 .

    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

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

  • 4

    我只是遇到了同样的问题,但达成了另一种解决方案 . 在我的例子中,我进行了集成测试,针对Cassandra实例运行多个测试;四次测试(不使用批次)成功完美,五分之一(使用批次)失败 .

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

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

相关问题