CassandraTemplate Spring-data-cassandra возвращает строку, а не указанный объект, при запуске функции queryForObject.

Я просматривал документацию 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();
        }
   }
}

person Sewook Wee    schedule 22.10.2014    source источник
comment
Становится очень плохо, когда код, предоставленный в документах, не работает :|   -  person mac    schedule 14.12.2014


Ответы (2)


CassandraTemplate queryForObject(String,Class) не предназначен для произвольного сопоставления объектов. Он создан по образцу JdbcTemplate queryForObject(String,Class). Он предназначен для типов, которые драйвер Cassandra может преобразовать напрямую.

Чтобы преобразовать произвольные определяемые приложением классы, используйте queryForObject(String,RowMapper<T>) или одну из его перегрузок. CqlTemplate не умеет сопоставлять произвольные классы; вы должны предоставить реализацию RowMapper<T> для вашего класса T.

person Matthew Adams    schedule 22.10.2014
comment
Спасибо!! Есть ли способ зарегистрировать RowMapper<T>, чтобы мы могли вызывать queryForObject(String, Class)? - person Sewook Wee; 23.10.2014
comment
Извините, не в это время. Я полагаю, вы могли бы создать подкласс CqlTemplate, добавить свойства для нужных вам RowMappers, внедрить их, а затем переопределить queryForObject(String,Class), чтобы он проверял, можно ли сопоставить данный класс с помощью одного из внедренных RowMappers. Вам решать. - person Matthew Adams; 24.10.2014

вы можете сделать это так: -

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.

также вам может понадобиться @Column(value = "your_columnName_in_DB"), если имя переменной вашего класса pojo отличается

лайк
@Column(value = "name") private String userName; @Column(value = "age") private int userAge;

вернуться сюда, если это работает?

Также вы можете помочь мне передать динамическое значение в эту строку myQuery.. используя object[] так же, как prepareStatment в SQL

Спасибо.

person nikhil mahajan    schedule 07.08.2015