我正在尝试使用独立的main()方法访问Cassandra @ localhost。 main()方法使用Spring-data-cassandra模块中的DataStax驱动程序和CassandraOperations类。 CassandraOperation
的{{1}}方法始终返回主键而不是实体对象。
我只是使用Spring Data Documentation中提供的代码示例。
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 + "]";
}
}
运行时异常:
线程“main”中的异常java.lang.ClassCastException:java.lang.String无法强制转换为com.prashanth.ts.entity.Person 在com.prashanth.ts.client.CassandraApp.main(CassandraApp.java:40) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) 在com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
我是Spring Data的新手。任何人都可以帮我识别我在这里做错了什么。
我也尝试删除QueryBuilder并将一个简单的查询字符串像“select * from person”传递给queryForObject()方法
注意: 插入操作工作正常。
答案 0 :(得分:0)
根据文档here判断,您需要为all
添加一个方法(QueryBuilder
):
Select s = QueryBuilder.select().all().from("person");
在旁注中,您使用的是spring-data-cassandra
,但您没有使用它的最佳功能,这会使您的代码更加简单。
答案 1 :(得分:0)
你可以这样做: -
String myQuery = "select * from person where id=1234567890";
Person personObj = cassandraOperations.selectOne(myQuery, Person.class);
<<
为了所有人
List<Person> personListObj = cassandraOperations.select(myQuery, Person.class);
&gt;&gt;
这项工作对我来说完全使用cassandraTemplete对象...没有尝试过cassandraOperation。
如果你的pojo类的变量名不同,你可能还需要@Column(value =&#34; your_columnName_in_DB&#34;)
像
@Column(value = "name")
private String userName;
@Column(value = "age")
private int userAge;
如果它有效,请回复此处吗?
你也可以帮助我将动态值传递给myQuery字符串..使用object []与SQL中的prepareStatment相同
感谢。
答案 2 :(得分:0)
我能够使用selectOne方法而不是queryForObject使其工作。
LOG.info(cassandraOps.selectOne(s, Person.class).getId());
答案 3 :(得分:0)
我可以看到OP在这里可能引起混淆。没有找到Eclipse提供的代码扩展,我去了org.springframework.data.cassandra.core 接口CassandraOperations文档。没有 queryForObject 的记录,因此除非有人可以另外解释
LOG.info(cassandraOps.queryForObject(s,Person.class).getId());
只是错误的代码。我试图找到正确的queryForObject用法,但是所有搜索都使我回到了该示例,该示例似乎起源于2008年。谁知道,它在某一点上可能起作用。 OP试图使用Cassandra Operations从“ s”中提取信息。我喜欢阿米特T的想法,并有所作为。我上课时使用Company而不是Person,但是想法是一样的。
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();
}
}
我还创建了自己的 CompanyInformation()作为练习。
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;]