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 中的异常:java.lang.String 无法在 com.prashanth.ts.client.CassandraApp.main(CassandraApp.java:40) 处转换​​为 com.prashanth.ts.entity.Person sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 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

我能够使用 selectOne 方法而不是 queryForObject 使其工作。

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

从这里的文档来看,您需要再添加一个方法(allQueryBuilder

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

附带说明一下,您正在使用 spring-data-cassandra但您没有使用它的最佳功能,这将使您的代码更简单。

于 2015-05-19T13:56:51.097 回答
0

我可以看到 OP 在这里可能会感到困惑。没有找到 Eclipse 提供的代码扩展我去了 org.springframework.data.cassandra.core 接口 CassandraOperations 文档。没有记录 queryForObject所以除非有人可以解释

LOG.info(cassandraOps.queryForObject(s, Person.class).getId());

只是糟糕的代码。我试图找到 queryForObject 的正确用法,但所有搜索都让我回到了似乎起源于 2008 年的示例。谁知道呢,在某一时刻它可能奏效了。OP 试图使用 Cassandra Operations 从“s”中提取信息。我喜欢 Amit T 的想法并得到了一些工作。我有自己的课程,使用 Company 而不是 Person,但想法是一样的。

try { 

               cluster = Cluster.builder().withoutMetrics().addContactPoints(InetAddress.getByName("192.168.1.5") ).build(); 

               session = cluster.connect("rant"); 

               CassandraOperations cassandraOps = new CassandraTemplate(session); 

               cassandraOps.insert(new Companies("name1", "user", "category", "first", "last", "city", "state", "zipcode", "phone", "email",  
                       "addr1c", "adddr2c", "cityc", "statec", "zipcodec", "phonec", "emailc", "website", 0.0, 0.0, 
                       0, 0, "pr", 0, "text"));

               Select s = QueryBuilder.select().from("companies"); 
               s.where(QueryBuilder.eq("company_company", "name1")); 

//             LOG.info(cassandraOps.queryForObject(s, Companies.class).getId()); 
               LOG.info(cassandraOps.selectOne(s, Companies.class).CompanyInformation());

               cassandraOps.truncate(Companies.class);  // empties the table

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

             } 

我还创建了自己的CompanyInformation()作为练习。

public String CompanyInformation() {
   System.out.println("Company Information " + this.company_company);
   return this.company_userid;
}  

输出符合预期。

19:35:24.456 [cluster1-nio-worker-2] DEBUG com.datastax.driver.core.Connection - Connection[/192.168.1.5:9042-2, inFlight=1, closed=false] Keyspace set to rant
Company Information name1      <== from CompanyInformation()
19:35:24.483 [main] INFO com.androidcommand.app.SpringRbsApplication - user <== from LOG.Info
19:35:24.485 [main] DEBUG org.springframework.data.cassandra.core.cql.CqlTemplate - Executing CQL Statement [TRUNCATE companies;]
于 2019-10-23T00:21:18.900 回答