Cassandra4.5驱动程序有问题。我无法让这些 @query 工作:
@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中运行良好。
谢谢
p、 以下是供任何人测试的表格:
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工作得很好-唯一的区别是counter字段。
更新#2。。。真正的问题,根本不是@query。。。但是@entity带有counter字段。
@CqlName("cntrfld")
private Long cntrFld;
如果这个字段是cassandra(3.11.4 btw)中的一个计数器,代码就挂起了。如果我把这个字段设为bigint,就可以了!
2条答案
按热度按时间w6lpcovy1#
我想你是想利用
@Insert
或者@Update
带有计数器列。这是行不通的:计数器是一种特殊类型的列,它们只支持递增或递减操作。不过,您可以使用实体执行读取或删除操作。但要知道最新情况,
@Query
是你现在唯一的选择:诚然,我们可以更好地支持Map器中的计数器。我认为这样的方法可以奏效:
我创建了java-2721来探索这个想法。
63lcw9qa2#
错误是,我的@dao有一个@insert,但表使用了counter字段类型。一旦我删除了@insert,系统就工作了。
我按照帮助创建了一个basedao类,其中包含重复的@insert和@delete方法集,因此我的错误并不明显。
图书馆应该在这种情况下抛出一个错误,而不仅仅是挂起。。。我想那是图书馆里的一个bug。