java cassandra对象映射注释

时间:2015-08-03 11:07:06

标签: java dictionary cassandra cql3 datastax-java-driver

您是否可以提供使用数据传播API注释来映射集合以使用Map的示例。

class pojo {

  @PartitionKey(value = 0)
  @Column(name = "user_id")
  String userId;

  @Column(name = "attributes")
      // How to map it
      Map<String, String> attributes;
    }

错误日志:

2015-08-03 16:33:34,568 INFO  com.jpma.jpmc.slot.persistance.DAOFactory main - Cassandra Cluster Details: ConnectionCfg [userName=test, password=test, port=9042, seeds=[Ljava.lang.String;@1a85bd75, keySpace=test]
java.lang.Class
2015-08-03 16:33:34,646 DEBUG com.datastax.driver.mapping.EntityMapper main - Preparing query INSERT INTO "test"."user_event_date"("user_id","entry_date","entry_time","app","attributes","user_ip","user_authschemes") VALUES (?,?,?,?,?,?,?);
com.datastax.driver.core.exceptions.InvalidQueryException: Unknown identifier attributes

1 个答案:

答案 0 :(得分:3)

根据您看到的错误消息,我猜测您的表定义中未定义attributes。你介意用它编辑你的帖子吗?

但是当我像这样构建我的CQL表时(注意itemidversion的复合分区键):

CREATE TABLE products.itemmaster (
    itemid text,
    version int,
    productid uuid,
    supplierskumap map<uuid, text>,
    PRIMARY KEY ((itemid,version), productid)
);

...插入此行:

INSERT INTO products.itemmaster (itemid,version,productid,supplierskumap) 
VALUES ('item1',1,26893749-dcfc-42c7-892c-bee8c9cff630,
        {1351f82f-5dc5-4328-82f4-962429c92a2b:'86CCG123'});

......我按照这样建立我的POJO:

@Table(keyspace = "products", name = "itemmaster")
public class Product {
    @PartitionKey(0)
    private String itemid;
    @PartitionKey(1)
    private int version;
    @ClusteringColumn
    private UUID productid;
    @Column(name="supplierskumap")
    private Map<UUID,String> suppliersku;

    public UUID getProductid() {
        return productid;
    }
    public void setProductid(UUID _productid) {
        this.productid = _productid;
    }
    public int getVersion() {
        return this.version;
    }
    public void setVersion(int _version)
    {
        this.version = _version;
    }
    public String getItemid() {
        return itemid;
    }
    public void setItemid(String _itemid) {
        this.itemid = _itemid;
    }
    public Map<UUID, String> getSuppliersku() {
        return suppliersku;
    }
    public void setSuppliersku(Map<UUID, String> _suppliersku) {
        this.suppliersku = _suppliersku;
    }
}

...在我的数据访问对象(dao)上使用此构造函数和getProd方法:

public ProductsDAO()
{
    session = connect(CASSANDRA_NODES, USERNAME, PASSWORD);
    prodMapper = new MappingManager(session).mapper(Product.class);
}

public Product getProd(String itemid, int version, UUID productid) {
    return prodMapper.get(itemid,version,sku);
}

...然后这个main类成功查询我的表并映射我的Map

private static void main(String[] args) {
        ProductsDAO dao = new ProductsDAO();
        Product prod = dao.getProd("item1", 1, UUID.fromString("26893749-dcfc-42c7-892c-bee8c9cff630"));

        System.out.println(
                prod.getProductid() + " - " + 
                prod.getItemid() + " - " + 
                prod.getSuppliersku().get(UUID.fromString("1351f82f-5dc5-4328-82f4-962429c92a2b")));

        dao.closeCassandra();
}

...并生成此输出:

26893749-dcfc-42c7-892c-bee8c9cff630 - item1 - 86CCG123

注意:编辑上面的示例以支持复合分区键。