Spring-data-cassandra 的 CassandraTemplate 在运行 queryForObject 函数时返回 String,而不是指定的 Object。



我一直在浏览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

我缺了什么吗?以下是从上面的文档中复制粘贴的相同内容。

人员类别看起来像:

@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();
        }
   }
}

CassandraTemplatequeryForObject(String,Class)不适用于任意对象映射。它是根据JdbcTemplatequeryForObject(String,Class)方法建立的。它旨在采用Cassandra驱动程序可以直接转换的类型。

要转换任意应用程序定义的类,请使用queryForObject(String,RowMapper<T>)或其重载之一。CqlTemplate不知道如何映射任意类;您必须为类T提供RowMapper<T>实现。

您可以这样做:-

String myQuery = "select * from person where id=1234567890";

Person personObj = cassandraOperations.selectOne(myQuery, Person.class);

<lt;对于所有人List<Person> personListObj = cassandraOperations.select(myQuery, Person.class);>

这项工作为我使用cassandraTemplete对象完美。。。没有尝试Cassandra手术。

如果pojo类的变量名与不同,您可能还需要@Column(value="your_columnName_in_DB")

喜欢
@Column(value = "name") private String userName; @Column(value = "age") private int userAge;

如果它有效,请返回此处?

您还可以帮我将动态值传递给myQuery字符串吗。。使用对象[]与SQL中的prepareStatment相同

谢谢。

相关内容

  • 没有找到相关文章

最新更新