我一直在浏览Spring Data Cassandra文档(http://docs.spring.io/spring-data/cassandra/docs/1.0.1.RELEASE/reference/html/cassandra.core.html) 基本上,通过适当的注释,我希望CassandraTemplate将一行映射到POJO对象,但它没有像我预期的那样工作。
对于电话,
cassandraOps.queryForObject(s,Person.class)
我收到如下错误:
线程“main”中的异常java.lang.ClassCastException:java.lang.String无法强制转换为Person
我缺少什么?以下是上述文档中的相同副本和粘贴。
Person Class看起来像:
@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("mykeyspace");
CassandraOperations cassandraOps = new CassandraTemplate(session);
cassandraOps.insert(new Person("1234567890", "David", 40));
Select s = QueryBuilder.select().from("person");
s.where(QueryBuilder.eq("id", "1234567890"));
LOG.info(cassandraOps.queryForObject(s, Person.class).getId());
cassandraOps.truncate("person");
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:2)
CassandraTemplate
的{{1}}不适用于任意对象映射。它以JdbcTemplate
's queryForObject(String,Class)
方法建模。它旨在采用Cassandra驱动程序可以直接转换的类型。
要转换任意应用程序定义的类,请使用queryForObject(String,RowMapper<T>)
或其中一个重载。 CqlTemplate不知道如何映射任意类;您必须为您的班级queryForObject(String,Class)
提供RowMapper<T>
实施。
答案 1 :(得分:2)
你可以这样做: -
String myQuery = "select * from person where id=1234567890";
Person personObj = cassandraOperations.selectOne(myQuery, Person.class);
&LT;&LT;
为了所有人
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相同
感谢。