Java Cassandra 4.5驱动程序问题,带有@Entity和Counter字段

Java Cassandra 4.5驱动程序问题,带有@Entity和Counter字段,java,cassandra,cassandra-driver,Java,Cassandra,Cassandra Driver,4.5版本的Cassandra驱动程序有问题。我无法让这些@查询中的任何一个正常工作: @Dao public interface SampleTable2Dao extends BaseDao<SampleTable2> { //@Query("UPDATE sampletable2 SET cntrfld = cntrfld + :toAdd WHERE key1 = :key1Value AND key2 = :key2Value AND key3 = :key3Val

4.5版本的Cassandra驱动程序有问题。我无法让这些@查询中的任何一个正常工作:

@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();
更新#1

经过一些挖掘,我发现它就在这个生成的代码中。与实际查询无关:

this.sampleTable2DaoCache = new LazyReference<>(() -> SampleTable2DaoImpl__MapperGenerated.init(context));

  @Override
  public SampleTable2Dao sampleTable2Dao() {
    return sampleTable2DaoCache.get();
  }

如果此字段是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);
}
诚然,我们可以更好地支持mapper中的计数器。我认为这样的方法可以奏效:

  @Increment
  void increment(SampleTable2 entity);

我是为了探索这个想法而创建的。

我认为您正在尝试使用带有计数器列的
@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);
}
诚然,我们可以更好地支持mapper中的计数器。我认为这样的方法可以奏效:

  @Increment
  void increment(SampleTable2 entity);

我创建这个表是为了探索这个想法。

错误是,我的@Dao有一个@Insert,但表使用了计数器字段类型。一旦我删除了@Insert,系统就工作了

我按照帮助创建了一个BaseDao类,其中包含重复的@Insert和@Delete方法集,因此我的错误并不明显


在这种情况下,库应该抛出一个错误,而不仅仅是挂起。。。我想这是库中的一个错误。

错误是,我的@Dao有一个@Insert,但表使用了计数器字段类型。一旦我删除了@Insert,系统就工作了

我按照帮助创建了一个BaseDao类,其中包含重复的@Insert和@Delete方法集,因此我的错误并不明显


在这种情况下,库应该抛出一个错误,而不仅仅是挂起。。。我想这是图书馆里的一个错误。

它对我很有用。您是如何建立会话的?一个潜在的问题是查询字符串中没有键空间,因此会话需要有一个默认键空间(
CqlSession.builder().withKeyspace(…)
)。但仍然缺少键空间会产生错误,而不是挂起。这不是问题所在。。。没有键空间我无法连接它。。。它可以连接。我还有一把刀还可以用。我试过4.5.1,但它还是坏了。我在原地踏步。。。似乎我不能使用映射器的计数器字段。它适合我。您是如何建立会话的?一个潜在的问题是查询字符串中没有键空间,因此会话需要有一个默认键空间(
CqlSession.builder().withKeyspace(…)
)。但仍然缺少键空间会产生错误,而不是挂起。这不是问题所在。。。没有键空间我无法连接它。。。它可以连接。我还有一把刀还可以用。我试过4.5.1,但它还是坏了。我在原地踏步。。。似乎我不能使用映射器的计数器字段。实际上。。。我的BaseDao确实有一个插入。。。也许就是这样。我会试着把它去掉。但它应该抛出一个错误,而不是永远挂起。只是一个想法我喜欢@Increment的想法。但是,您需要能够控制要递增的数字。即@Increment void Increment(样本表2实体,长增量);或者,您是否希望代码在调用之前将增量号放入实体变量字段中?是的,我们必须稍微细化API:不同的增量(包括负数)、多个计数器等等。。。我的BaseDao确实有一个插入。。。也许就是这样。我会试着把它去掉。但它应该抛出一个错误,而不是永远挂起。只是一个想法我喜欢@Increment的想法。但是,您需要能够控制要递增的数字。即@Increment void Increment(样本表2实体,长增量);或者,您是否希望代码在调用之前将增量号放入实体变量字段中?是的,我们必须稍微细化API:不同的增量(包括负数)、多个计数器、,等等。我顺便得到一个错误:
com.datastax.oss.driver.api.core.servererrors.InvalidQueryException:计数器表上不允许使用INSERT语句,当我从映射器获取DAO时,请改用UPDATE
。可能还有其他问题,请尝试调试。我得到了一个错误:
com.datastax.oss.driver.api.core.servererrors.InvalidQueryException:计数器表上不允许使用INSERT语句,当我从映射器获取DAO时,请改用UPDATE
。可能还有其他问题,请尝试调试。