【发布时间】:2020-07-14 12:44:26
【问题描述】:
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 中运行良好。
谢谢
附:这是任何人都想测试的表格:
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,它就可以正常工作!
【问题讨论】:
-
它对我有用。你是如何建立你的会话的?一个潜在的问题是查询字符串中没有键空间,因此您的会话需要有一个默认值 (
CqlSession.builder().withKeyspace(...))。但仍然缺少键空间应该产生错误,而不是挂起。 -
这不是问题...没有键空间我无法连接...它可以连接。我还有另一个 dao 工作得很好。
-
我试过4.5.1,还是坏了。我处于静止状态......似乎我不能在映射器中使用计数器字段。
标签: java cassandra cassandra-driver