CassandraOperations queryForObject()方法始终返回PrimaryKey而不是Entity Object

时间:2015-05-19 01:55:52

标签: cassandra spring-data spring-data-cassandra

我正在尝试使用独立的main()方法访问Cassandra @ localhost。 main()方法使用Spring-data-cassandra模块中的DataStax驱动程序和CassandraOperations类。 CassandraOperation的{​​{1}}方法始终返回主键而不是实体对象。

我只是使用Spring Data Documentation中提供的代码示例。

queryForObject()

客户代码:

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

运行时异常:

  

线程“main”中的异常java.lang.ClassCastException:java.lang.String无法强制转换为com.prashanth.ts.entity.Person           在com.prashanth.ts.client.CassandraApp.main(CassandraApp.java:40)           at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)           at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)           at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)           at java.lang.reflect.Method.invoke(Method.java:606)           在com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

我是Spring Data的新手。任何人都可以帮我识别我在这里做错了什么。

我也尝试删除QueryBuilder并将一个简单的查询字符串像“select * from person”传递给queryForObject()方法

注意: 插入操作工作正常。

4 个答案:

答案 0 :(得分:0)

根据文档here判断,您需要为all添加一个方法(QueryBuilder):

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

在旁注中,您使用的是spring-data-cassandra,但您没有使用它的最佳功能,这会使您的代码更加简单。

答案 1 :(得分:0)

你可以这样做: -

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

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

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

这项工作对我来说完全使用cassandraTemplete对象...没有尝试过cassandraOperation。

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


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

如果它有效,请回复此处吗?

你也可以帮助我将动态值传递给myQuery字符串..使用object []与SQL中的prepareStatment相同

感谢。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

我可以看到OP在这里可能引起混淆。没有找到Eclipse提供的代码扩展,我去了org.springframework.data.cassandra.core 接口CassandraOperations文档。没有 queryForObject 的记录,因此除非有人可以另外解释

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

只是错误的代码。我试图找到正确的queryForObject用法,但是所有搜索都使我回到了该示例,该示例似乎起源于2008年。谁知道,它在某一点上可能起作用。 OP试图使用Cassandra Operations从“ s”中提取信息。我喜欢阿米特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;]