CassandraJava请求
我试图使用Cassandra数据库在Java中执行一个简单的请求,但我不理解我的示例,因为它不起作用:
public class Test {
public static void main( String[] args )
{
Cluster cluster = Cluster.builder()
.addContactPoints("127.0.0.1")
.build();
Session session = cluster.connect("test");
ResultSet results = session.execute("SELECT * FROM datatest");
for ( Row row : results ) {
System.out.println(row.getString("name"));
}
}
}
当我执行代码时,出现以下错误:
[main] INFO com.datastax.driver.core.policies.DCAwareRoundRobinPolicy - Using data-center name 'datacenter1' for DCAwareRoundRobinPolicy (if this is incorrect, please provide the correct datacenter name with DCAwareRoundRobinPolicy constructor)
[main] INFO com.datastax.driver.core.Cluster - New Cassandra host /127.0.0.1:9042 added
Exception in thread "main" java.lang.IllegalArgumentException: name is not a column defined in this metadata
at com.datastax.driver.core.ColumnDefinitions.getAllIdx(ColumnDefinitions.java:273)
at com.datastax.driver.core.ColumnDefinitions.getFirstIdx(ColumnDefinitions.java:279)
at com.datastax.driver.core.ArrayBackedRow.getIndexOf(ArrayBackedRow.java:69)
at com.datastax.driver.core.AbstractGettableData.getString(AbstractGettableData.java:137)
at fakemillions.Test.main(Test.java:23)
这是我的数据库:
# 1 楼答案
当您使用thrift创建一个表时,它包含动态列,因此没有给出显式的列定义,那么CQL在默认情况下分配以下名称:
key
,column1
,value
。在您的例子中,它将有column1
包含值“name”,value
列将包含“TiTi”等就这样想吧。数据实际上存储为键值对。CQL无法从这些键值对推断出任何列名,因为同一行中可能有数十亿个不同的键(列名)
下面是一个将节约表迁移到cql的好指南:http://www.datastax.com/dev/blog/thrift-to-cql3
# 2 楼答案
听起来好像您没有在表datatest中定义名为“name”的列。我以前没有使用过Datastax驱动程序,但是正如documentation所说,如果
如果您提供了如何创建datatest表,那就更好了
# 3 楼答案
试试我的情况