cassandraoperations queryForObject()方法始终返回primarykey而不是实体对象



我正在尝试使用独立的main()方法访问cassandra @ localhost。Main()方法使用Spring-Data-Cassandra模块的DataStax驱动程序和Cassandraeperations类。CassandraOperationqueryForObject()方法始终返回主键,而不是实体对象。

我只是使用弹簧数据文档中给出的代码示例。

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

运行时异常:

线程" main" java.lang.classcastException中的例外:java.lang.string不能被施加到com.prashanth.ts.entity.person。 在com.prashanth.ts.client.cassandraapp.main(cassandraapp.java:40) 在sun.reflect.nativemethodaccessorimpl.invoke0(天然方法) 在sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:57) 在sun.reflect.delegatingmethodaccessorimpl.invoke(授权methodaccessorimpl.java:43) 在java.lang.reflect.method.invoke(method.java:606) 在com.intellij.rt.execution.application.appmain.main(appmain.java:140)

我是春季数据的新手。任何人都可以帮助我确定我在这里做错了什么。

我还尝试删除QueryBuilder并将简单的查询字符串传递到诸如" select * from person"到queryForObject()methodd

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

我能够使用SelectOne方法而不是QueryForObject。

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

在此处通过文档来判断,您需要为QueryBuilder添加另外一种方法(all):

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

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

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

log.info(cassandraops.queryforobject(s,person.class).getID());

只是不良代码。我试图找到正确的QueryForObject用法,但是所有搜索都使我回到了所讨论的示例中,该示例似乎起源于2008年。谁知道,它可能奏效了。OP试图使用Cassandra操作从" S"中提取信息。我喜欢Amit T的想法,并有所作为。我有自己的班级使用公司而不是人,但这个想法是相同的。

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

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

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;]

相关内容

  • 没有找到相关文章

最新更新