2014-02-10 70 views
3

什麼是從Datastax Java驅動程序建立與一個QueryBuilder的INSERT語句的卡桑德拉Datastax QueryBuilder的INSERT語句

我使用卡桑德拉2.X與Java驅動程序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

+0

剛跑過你的代碼,它工作正常。檢查你是否真的放棄了「用戶」CF,並確保KEYSPACE_NAME符合你的期望(即「測試」) –

+0

@LyubenTodorov謝謝你的嘗試。你可以看到我的答案,爲什麼我看到這個錯誤。它歸結爲Session對象不會刷新其創建Session對象時獲取的TableMetaData。 –

+0

這聽起來很奇怪,你能告訴我你正在使用的代碼(也許在[gist](https://gist.github.com/)) –

回答

3

你只是忘了創建keyspace。

用於創建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

這個工作?什麼版本的卡桑德拉做了這個工作? –

+0

你的代碼工作正常。今晚晚些時候我將不得不在家用機器上看到問題。這很奇怪。 –

+0

我會接受你的答案,因爲它的工作完美無瑕。但我仍然不明白爲什麼我看到錯誤。 –

4

我找不到官方文檔頁面上的任何實例有一個在代碼中沒有問題。錯誤是由於被查詢的CF是在同一個會話中創建的。在這種情況下,需要爲Session創建一個新的會話以獲取有關CF的TableMetaData。我只是假設自連接建立以來,會話將在Insert語句之前更新其TableMetaData。不幸的是並非如此。

0

我剛剛有同樣的問題,但到了不同的解決方案。在我的情況下,我有一個集成測試,對Cassandra實例運行多個測試;四次測試(不使用批次)完美成功,五次(使用批次)失敗。

出於某種原因,CQL解析器將所有的名稱爲小寫,所以如果你有混合大小寫字母密鑰空間或列的姓,你必須圍繞密鑰空間或列的家庭與報價的名稱,即

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