2014-11-04 22 views
1

我在卡桑德拉2.1中使用Cassandra Object Mapping API。在API,它看起来像一排的UPDATE进行做这些步骤:Cassandra对象映射API目前不支持更新吗?

  1. 获取对象(Mapper.get)
  2. 变化要更新
  3. 保存对象的字段( Mapper.save)

其转换为一个SELECT后跟一个INSERT。现在的CQL3.1 UPDATE语句在Cassandra对象映射API的稍后阶段是否支持部分更新?我想避免最初的阅读。

回答

2
  1. 您可以使用Accessor来编码更新。

  2. 透明save VS update要么会是使用代理和外地拦截器(复杂IMPL)规定,或导致实际上隐藏读之前节省反模式。

使用访问器应该为您提供所需的一切,而无需使映射模块在幕后执行魔术。

这个主题已经在这里讨论:https://datastax-oss.atlassian.net/plugins/servlet/mobile#issue/JAVA-474

+0

感谢亚历克斯,我都会看着那吉拉,看看你们拿出。我猜“Accessor”与编写自己的CQL语句几乎相同(这非常灵活)。 'Accessor'语法的一个问题是你静态定义要更新的列是否正确?例如:'@Query(“UPDATE users SET first_name =:first,last_name =:last WHERE id =:id”)'我总是需要同时更新'first'和'last',据我了解。 – reikje 2014-11-05 08:47:03

0

试试这个映射 https://github.com/valchkou/cassandra-driver-mapping

它支持局部更新,包括集合

mapper.updateValue(id, Entity.class, propertyName, value); 

/** Append value to the Set, List or Map. */ 
append(id, Entity.class, propertyName, value); 

https://github.com/valchkou/cassandra-driver-mapping#write

而且它具有自动模式同步功能(和更少的功能)在数据传输中漏掉了映射器

用法示例:

Entity entity = new Entity(); 
mappingSession.save(entity); 
entity = mappingSession.get(Entity.class, id); 
mappingSession.delete(entity); 

Maven的中央可供选择:

<dependency> 
    <groupId>com.valchkou.datastax</groupId> 
    <artifactId>cassandra-driver-mapping</artifactId>   
</dependency> 
相关问题