我正在尝试使用独立的main()方法访问cassandra @ localhost。Main()方法使用Spring-Data-Cassandra模块的DataStax驱动程序和Cassandraeperations类。CassandraOperation
的queryForObject()
方法始终返回主键,而不是实体对象。
我只是使用弹簧数据文档中给出的代码示例。
Apache-Cassandra version : 2.1.2
Spring-Data-Cassandra version : 1.2.0.RELEASE
Entity Class :
import org.springframework.data.cassandra.mapping.PrimaryKey;
import org.springframework.data.cassandra.mapping.Table;
@Table
public class Person {
@PrimaryKey
private String id;
private String name;
private int age;
public Person(String id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
客户端代码:
public class CassandraApp {
private static final Logger LOG = LoggerFactory.getLogger(CassandraApp.class);
private static Cluster cluster;
private static Session session;
public static void main(String[] args) {
try {
cluster = Cluster.builder().addContactPoints(InetAddress.getLocalHost()).build();
session = cluster.connect("person");
CassandraOperations cassandraOps = new CassandraTemplate(session);
cassandraOps.insert(new Person("1234567890", "David", 40));
Select s = QueryBuilder.select().from("person");
s.where(QueryBuilder.eq("id", "1234567890"));
System.out.println(cassandraOps.queryForObject(s, Person.class).getId());
cassandraOps.truncate("person");
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
运行时异常:
线程" main" java.lang.classcastException中的例外:java.lang.string不能被施加到com.prashanth.ts.entity.person。 在com.prashanth.ts.client.cassandraapp.main(cassandraapp.java:40) 在sun.reflect.nativemethodaccessorimpl.invoke0(天然方法) 在sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:57) 在sun.reflect.delegatingmethodaccessorimpl.invoke(授权methodaccessorimpl.java:43) 在java.lang.reflect.method.invoke(method.java:606) 在com.intellij.rt.execution.application.appmain.main(appmain.java:140)
我是春季数据的新手。任何人都可以帮助我确定我在这里做错了什么。
我还尝试删除QueryBuilder并将简单的查询字符串传递到诸如" select * from person"到queryForObject()methodd
注意:插入操作正常工作。
我能够使用SelectOne方法而不是QueryForObject。
LOG.info(cassandraOps.selectOne(s, Person.class).getId());
在此处通过文档来判断,您需要为QueryBuilder
添加另外一种方法(all
):
Select s = QueryBuilder.select().all().from("person");
在旁注上,您正在使用spring-data-cassandra
,但您并没有使用它的最佳功能,这会使您的代码变得更加简单。
我可以看到OP在这里可能会感到困惑的地方。没有找到Eclipse提供的代码扩展名,我去了org.springframework.data.cassandra.core。接口Cassandraeperations文档。没有 queryForObject 记录,除非有人可以解释另有说明
log.info(cassandraops.queryforobject(s,person.class).getID());
只是不良代码。我试图找到正确的QueryForObject用法,但是所有搜索都使我回到了所讨论的示例中,该示例似乎起源于2008年。谁知道,它可能奏效了。OP试图使用Cassandra操作从" S"中提取信息。我喜欢Amit T的想法,并有所作为。我有自己的班级使用公司而不是人,但这个想法是相同的。
try {
cluster = Cluster.builder().withoutMetrics().addContactPoints(InetAddress.getByName("192.168.1.5") ).build();
session = cluster.connect("rant");
CassandraOperations cassandraOps = new CassandraTemplate(session);
cassandraOps.insert(new Companies("name1", "user", "category", "first", "last", "city", "state", "zipcode", "phone", "email",
"addr1c", "adddr2c", "cityc", "statec", "zipcodec", "phonec", "emailc", "website", 0.0, 0.0,
0, 0, "pr", 0, "text"));
Select s = QueryBuilder.select().from("companies");
s.where(QueryBuilder.eq("company_company", "name1"));
// LOG.info(cassandraOps.queryForObject(s, Companies.class).getId());
LOG.info(cassandraOps.selectOne(s, Companies.class).CompanyInformation());
cassandraOps.truncate(Companies.class); // empties the table
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
我还创建了自己的 compandInformation()作为练习。
public String CompanyInformation() {
System.out.println("Company Information " + this.company_company);
return this.company_userid;
}
输出是预期的。
19:35:24.456 [cluster1-nio-worker-2] DEBUG com.datastax.driver.core.Connection - Connection[/192.168.1.5:9042-2, inFlight=1, closed=false] Keyspace set to rant
Company Information name1 <== from CompanyInformation()
19:35:24.483 [main] INFO com.androidcommand.app.SpringRbsApplication - user <== from LOG.Info
19:35:24.485 [main] DEBUG org.springframework.data.cassandra.core.cql.CqlTemplate - Executing CQL Statement [TRUNCATE companies;]