如何从 java 中使用 cassandra-driver 的 UDT 集合(对于 ex:list)读取 UDT?
How to read the UDTs from collection(for ex:list) of UDTs with cassandra-driver in java?
我有tableemp(id,name,list<frozen<address>>)
。这里的地址是定义为 create TYPE address (hno int,street text);
的 cassandra UDT。我正在尝试使用以下代码读取 emp 中给定 ID 的所有地址,但出现以下错误:
Exception in thread "main" com.datastax.driver.core.exceptions.CodecNotFoundException: Codec not found for requested operation: [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代码中的冻结地址列表?
您可以逐行读取值并逐行读取元数据:
UDTValue udtData = row.getUDTValue(address);
例如:
udtData.getString("name");
更新列表示例
对于列表,它应该看起来像:
List<UDTValue> udtDataList = row.getList("adresses", UDTValue.class)
然后您可以轻松地遍历列表并访问您的数据字段。
最佳
您可能希望为此目的使用 datastax Mapper。您必须使用 Datastax 注释声明 Java table 并键入 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 访问您的列表。
我有tableemp(id,name,list<frozen<address>>)
。这里的地址是定义为 create TYPE address (hno int,street text);
的 cassandra UDT。我正在尝试使用以下代码读取 emp 中给定 ID 的所有地址,但出现以下错误:
Exception in thread "main" com.datastax.driver.core.exceptions.CodecNotFoundException: Codec not found for requested operation: [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代码中的冻结地址列表?
您可以逐行读取值并逐行读取元数据:
UDTValue udtData = row.getUDTValue(address);
例如:
udtData.getString("name");
更新列表示例
对于列表,它应该看起来像:
List<UDTValue> udtDataList = row.getList("adresses", UDTValue.class)
然后您可以轻松地遍历列表并访问您的数据字段。
最佳
您可能希望为此目的使用 datastax Mapper。您必须使用 Datastax 注释声明 Java table 并键入 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 访问您的列表。