java - 带有 @Entity 和 Counter 字段的 Cassandra 4.5 驱动程序问题
问题描述
4.5 Datastax Cassandra 驱动程序有问题。我无法让这些@Queries 中的任何一个工作:
@Dao
public interface SampleTable2Dao extends BaseDao<SampleTable2> {
//@Query("UPDATE sampletable2 SET cntrfld = cntrfld + :toAdd WHERE key1 = :key1Value AND key2 = :key2Value AND key3 = :key3Value")
@Query("UPDATE sampletable2 SET cntrfld = cntrfld + 1 WHERE key1 = 1 AND key2 = 1 AND key3 = 1;")
CompletableFuture<Void> addCountAsync(int toAdd, int key1Value, int key2Value, int key3Value);
@Query("UPDATE sampletable2 SET cntrfld = cntrfld + 1 WHERE key1 = 1 AND key2 = 1 AND key3 = 1;")
void addCount(int toAdd, int key1Value, int key2Value, int key3Value);
@Query("UPDATE sampletable2 SET cntrfld = cntrfld + 1 WHERE key1 = 1 AND key2 = 1 AND key3 = 1;")
void addCount();
它只是挂起:
getSampleTable2Dao().addCount();
查询直接在 Cassandra 中运行良好。
谢谢
PS这里是任何人都想测试的表格:
CREATE TABLE sampletable2 (
key1 int,
key2 int,
key3 int,
cntrfld counter,
PRIMARY KEY (key1, key2, key3)
);
更新#1
经过一番挖掘,我发现它在这个生成的代码中挂起。与实际查询无关:
this.sampleTable2DaoCache = new LazyReference<>(() -> SampleTable2DaoImpl__MapperGenerated.init(context));
@Override
public SampleTable2Dao sampleTable2Dao() {
return sampleTable2DaoCache.get();
}
我正在向后工作,直到我可以让它工作为止。其他 DAO 工作正常 - 唯一的区别是计数器字段。
更新#2 ...“真正的”问题根本不是@Query ...而是带有计数器字段的@Entity。
@CqlName("cntrfld")
private Long cntrFld;
如果此字段是 Cassandra (3.11.4 btw) 中的计数器,则代码将挂起。如果我将字段设置为 bigint,它就可以正常工作!
解决方案
我认为您正在尝试使用@Insert
或@Update
使用计数器列。那是行不通的:计数器是一种特殊类型的列,它们只支持递增或递减操作。
不过,您可以使用实体进行读取或删除操作。但是对于更新,@Query
您现在唯一的选择是:
@Entity @CqlName("sampletable2")
public class SampleTable2 {
@PartitionKey private int key1;
@ClusteringColumn(1) private int key2;
@ClusteringColumn(2) private int key3;
private long cntrfld;
// getters and setters...
}
@Dao
public interface SampleTable2Dao {
@Select
SampleTable2 get(int key1, int key2, int key3);
@Delete
void delete(SampleTable2 entity);
@Query(
"UPDATE sampletable2 SET cntrfld = cntrfld + 1 "
+ "WHERE key1 = :key1 AND key2 = :key2 AND key3 = :key3")
void increment(int key1, int key2, int key3);
// THIS WON'T WORK:
// @Insert
// void insert(SampleTable2 entity);
}
诚然,我们可以更好地支持映射器中的计数器。我认为这样的事情可以工作:
@Increment
void increment(SampleTable2 entity);
我创建了JAVA-2721来探索这个想法。
推荐阅读
- java - 为什么会话超时在 JBoss 中不起作用
- c - argp:如何将 argp_state 传递给 argp_usage、argp_error 等...?
- sharepoint - 用于从附加文本字段聚合历史数据的 SharePoint 工作流
- php - 如何通过 PHP 脚本 FTP 到服务器
- javascript - node-windows 服务如何停止运行?
- jquery - 为什么使用jQuery提交功能时此表单不提交
- node.js - 在谷歌云存储上传图像时文件大小为零字节---nodejs?
- npm - 安装后无法找到本地 Grunt
- android - 如何在 Android 上对 Sentry 事件进行分组?
- c# - 每个客户中的 Linq to SQL 有效联系人