如何从java中使用cassandra-driver的UDT集合(例如:列表)中读取UDT?

时间:2017-01-11 11:19:21

标签: java cassandra cassandra-3.0 user-defined-types

我有表emp(id,name,list<frozen<address>>)。这里的地址是cassandra UDT,定义为create TYPE address (hno int,street text);。我试图使用下面的代码读取emp中给定id的所有地址,我收到以下错误:

  

线程中的异常&#34; main&#34; com.datastax.driver.core.exceptions.CodecNotFoundException:找不到请求操作的编解码器:[冻结&lt;&#39;地址&#39;&gt; &LT; - &GT; com.xyz.cassandra.address]

String query1="select * from iotbilling.emp where id=?";
PreparedStatement preparedStatement2=this.session.prepare(query1);
BoundStatement boundStatement2=preparedStatement2.bind(4);
ResultSet rs2=this.session.execute(boundStatement2);
Row row2=rs2.one();
List<address> addresses=row2.getList("adresses",address.class);
System.out.println("Addresses retrieved");
for(address adr:addresses)
    System.out.println(adr.toString());

`

这里,如何捕获从cassandra返回的java代码中的冻结地址列表?

2 个答案:

答案 0 :(得分:2)

您可以从行读取值并逐行读取元数据:

UDTValue udtData = row.getUDTValue(address);

例如:

udtData.getString("name");

使用列表示例进行更新

对于列表,它应该看起来像:

List<UDTValue> udtDataList = row.getList("adresses", UDTValue.class)

然后,您可以轻松遍历列表并访问数据字段。

最佳

答案 1 :(得分:0)

您可能希望将datastax Mapper用于此目的。您必须使用如下所示的Datastax注释声明Java表并键入Table:

    @Table(keyspace = "corporate", name = "emp")
     public class Employee{

          @PartitionKey(0)
          @Column(name = "id")
           private Integer id;

          @Column(name = "name")
           private String name;

          @Frozen
          @Column(name = "address_list")
          private List<Address> address;

          ...(Getter and Setters)
     }

你的UDT注释如下:

     @UDT(keyspace = "corporate", name="address")
     public class Address{

          @Field(name="hno")
          private Integer hno;

          @Field(name="street")
          private String street;

          ...(Getters and Setters)
     }

如果您没有

,可能需要事先将以下依赖项添加到pom.xml文件中
    <dependency>
        <groupId>com.datastax.cassandra</groupId>
        <artifactId>cassandra-driver-core</artifactId>
        <version>3.3.0</version>
    </dependency>
    <dependency>
        <groupId>com.datastax.cassandra</groupId>
        <artifactId>cassandra-driver-mapping</artifactId>
        <version>3.3.0</version>
    </dependency>

完成这些步骤后,您需要使用Mapper对象来获得结果:

    MappingManager manager = new MappingManager(this.session);
    Mapper<Employee> mapper = manager.mapper(Employee.class);

一旦你得到resultSet,就用mapper来获取:

    Result<Employee> list = mapper.map(rs2);
    Employee emp = list.one();

现在您可以将emp作为java对象访问,并使用emp.getAddress访问您的列表。