【问题标题】:Spring-data-cassandra's CassandraTemplate returns String, not a specified Object, when run queryForObject function.Spring-data-cassandra 的 CassandraTemplate 在运行 queryForObject 函数时返回 String,而不是指定的 Object。
【发布时间】:2015-08-07 16:59:28
【问题描述】:

我一直在阅读 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 类看起来像:

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

【问题讨论】:

  • 当文档中提供的代码不起作用时,情况会变得非常糟糕:|

标签: spring-data-cassandra


【解决方案1】:

CassandraTemplatequeryForObject(String,Class) 不适用于任意对象映射。它以JdbcTemplate's queryForObject(String,Class) 方法为模型。它旨在采用 Cassandra 驱动程序可以直接转换的类型。

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

【讨论】:

  • 谢谢!!有什么方法可以注册RowMapper<T>,以便我们可以调用queryForObject(String, Class)
  • 抱歉,暂时没有。我想你可以继承 CqlTemplate,为你想要的 RowMappers 添加属性,注入它们,然后覆盖 queryForObject(String,Class) 以便它检查给定的类是否可以使用注入的 RowMappers 之一进行映射。由你决定。
【解决方案2】:

你可以这样做:-

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

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

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

这对我来说完美地使用了 cassandraTemplete 对象...没有尝试 cassandraOperation。

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

点赞
@Column(value = "name") private String userName; @Column(value = "age") private int userAge;

如果它的工作恢复这里?

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

谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-01
    • 2012-10-13
    • 2019-10-18
    • 2016-06-13
    • 1970-01-01
    • 2014-09-08
    • 2018-10-03
    • 1970-01-01
    相关资源
    最近更新 更多