Pavan Kumar Patil
Pavan Kumar Patil

Reputation: 111

java cassandra object mapping annotations

Can you provide an example for mapping collections using datastax api annotations to use Map.

class pojo {

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

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

error log :

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

Upvotes: 2

Views: 5002

Answers (1)

Aaron
Aaron

Reputation: 57808

Based on the error message you are seeing, I'm guessing that attributes is not defined in your table definition. Would you mind editing your post with that?

But when I build my CQL table like this (note the compound partition key of itemid and version):

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

...insert this row:

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

...and I build my POJO like this:

@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;
    }
}

...with this constructor and getProd method on my data access object (dao):

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);
}

...then this main class successfully queries my table and maps my 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();
}

...and produces this output:

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

NOTE: Edit made to the above example to support a compound partition key.

Upvotes: 3

Related Questions