我正在使用datastax cassandra 3.1.2。我在cassandra中创建了下表并插入了一条记录。
CREATE TYPE memory ( capacity text );
create TABLE laptop ( id uuid primary key, model text, ram frozen<memory> );
select * from laptop ;
id | model | ram
--------------------------------------+---------------+-------------------
e55cba2b-0847-40d5-ad56-ae97e793dc3e | Dell Latitude | {capacity: '8gb'}
当我尝试使用带有以下代码的Cassandra Accessor从Java中的冻结类型内存中获取容量字段时:
this.cluster = Cluster.builder().addContactPoint(node).withPort(port).build();
session = cluster.connect();
MappingManager manager = new MappingManager(session);
LaptopAccessor laptopAccessor = manager.createAccessor(LaptopAccessor.class);
Result<Laptop> cp = laptopAccessor.getOne(UUID.fromString("e55cba2b-0847-40d5-ad56-ae97e793dc3e"));
System.out.println(cp.one());
它给ram datapoint本身是null。
id = null model = null ram = null
我期待映射器在映射时将创建ram实例并将容量字段映射到其中并返回Laptop bean。
我有以下Accessor界面:
@Accessor
interface LaptopAccessor {
@Query("SELECT ram.capacity FROM user_info.laptop where id=?")
Result<Laptop> getOne(UUID id);
}
我有上面表格的以下java bean。
@Table(keyspace = "user_info", name = "laptop")
public class Laptop {
private UUID id;
private String model;
private Memory ram;
@PartitionKey
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
@Frozen
public Memory getRam() {
return ram;
}
public void setRam(Memory ram) {
this.ram = ram;
}
@Override
public String toString() {
return "id = " + id + " model = " + model + " ram = " + ram;
}
}
@UDT(keyspace = "user_info", name = "memory")
public class Memory {
private String capacity;
@Field
public String getCapacity() {
return capacity;
}
public void setCapacity(String capacity) {
this.capacity = capacity;
}
@Override
public String toString() {
return "capacity = " + capacity ;
}
}
当我更改查询以检索整个ram UDT时,代码工作正常。当我从查询中的udt中选择一些字段时,有人可以告诉我为什么映射器不起作用吗?
cassandra不支持这个吗?获取UDT字段的任何解决方法?
答案 0 :(得分:1)
我认为问题是访问者的返回类型:
@Accessor
interface LaptopAccessor {
@Query("SELECT ram.capacity FROM user_info.laptop where id=?")
Result<Laptop> getOne(UUID id);
}
由于您的查询仅选择ram.capacity
,所有驱动程序返回的行都是一行,其中String
列为ram.capacity
,其名称为Laptop
,但未映射到Accessor
中的任何字段。
相反,由于看起来您想要的只是与该查询匹配的1行,因此您可以将@Accessor
interface LaptopAccessor {
@Query("SELECT ram.capacity FROM user_info.laptop where id=?")
ResultSet getOne(UUID id);
}
更改为:
ResultSet
访问者现在返回one().getString(0)
,您可以调用ResultSet
来恢复容量。如果您不想直接处理Laptop
,但效果不错,那就不理想了。
你不应该真的需要整个function b() {
console.log('original b');
}
function a() {
b();
}
exports.a = a
exports.b = b;
对象,因为你要求的是UDT的一个领域吗?