1

スタンドアロンの main() メソッドを使用して Cassandra @ localhost にアクセスしようとしています。main() メソッドは、spring-data-cassandra モジュールの DataStax ドライバーと CassandraOperations クラスを使用します。CassandraOperationqueryForObject()メソッドは、エンティティ オブジェクトではなく常に主キーを返します。

Spring Data Documentationに記載されているコード例を使用しています。

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 + "]";
    }
}

クライアントコード:

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("person");

            CassandraOperations cassandraOps = new CassandraTemplate(session);

            cassandraOps.insert(new Person("1234567890", "David", 40));

            Select s = QueryBuilder.select().from("person");
            s.where(QueryBuilder.eq("id", "1234567890"));

            System.out.println(cassandraOps.queryForObject(s, Person.class).getId());

            cassandraOps.truncate("person");

        } catch (UnknownHostException e) {
            e.printStackTrace();
        }

    }
}

ランタイム例外:

スレッド「メイン」の例外 java.lang.ClassCastException: com.prashanth.ts.client.CassandraApp.main(CassandraApp.java:40) で java.lang.String を com.prashanth.ts.entity.Person にキャストできませんsun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブ メソッド) で sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) で、sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) で java.lang.reflect.Method で。 com.intellij.rt.execution.application.AppMain.main (AppMain.java:140) での呼び出し (Method.java:606)

Spring Data は初めてです。ここで私が間違っていることを特定するのに役立つ人は誰でもいます。

また、QueryBuilder を削除して、「select * from person」のような単純なクエリ文字列を queryForObject() メソッドに渡そうとしました。

注:挿入操作は完全に機能しています。

4

3 に答える 3

1

queryForObject の代わりに selectOne メソッドを使用して機能させることができました。

LOG.info(cassandraOps.selectOne(s, Person.class).getId());
于 2016-01-26T22:27:23.807 に答える
0

ここのドキュメントから判断すると、次のメソッドallをもう 1 つ追加する必要がありますQueryBuilder

  Select s = QueryBuilder.select().all().from("person");

ちなみに、あなたは使用して spring-data-cassandraいますが、コードをより簡単にする最高の機能を利用していません。

于 2015-05-19T13:56:51.097 に答える