首页 文章

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

提问于
浏览
1

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

线程“main”中的异常com.datastax.driver.core.exceptions.CodecNotFoundException:找不到请求操作的编解码器:[frozen <'address'> < - > 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 回答

  • 1

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

    UDTValue udtData = row.getUDTValue(address);
    

    例如:

    udtData.getString("name");
    

    Update with list example

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

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

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

    最好

  • 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访问您的列表 .

相关问题