Проблема с драйвером Cassandra 4.5 с полями @Entity и Counter - PullRequest
1 голос
/ 02 апреля 2020

Возникла проблема с драйвером 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();

Запросы работают нормально непосредственно в Кассандре.

Спасибо

PS Вот таблица, которую хочет проверить каждый:

CREATE TABLE sampletable2 (
    key1 int,
    key2 int,
    key3 int,
    cntrfld counter,
    PRIMARY KEY (key1, key2, key3)
);

update # 1

После некоторого копания я обнаружил, что именно в этом сгенерированном коде он висит. Ничего общего с фактическим запросом:

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

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

Я работаю в обратном направлении, разбирая вещи, пока не смогу заставить их работать. Другие DAO работают нормально - единственная разница с этим - поле счетчика.

UPDATE # 2 ... "реальная" проблема вовсе не в @Query ... а в @Entity с полями счетчика.

@CqlName("cntrfld")
private Long cntrFld;

Если в Кассандре это поле является счетчиком (3.11.4 btw), код просто зависает. Если я сделаю поле bigint, он будет работать просто отлично!

Ответы [ 2 ]

2 голосов
/ 02 апреля 2020

Я думаю, вы пытаетесь использовать @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 , чтобы исследовать идею.

1 голос
/ 03 апреля 2020

Ошибка была в том, что у моего @Dao был @Insert, но в таблице использовался тип поля счетчика. После того как я удалил @Insert, система работала.

Я последовал за помощью и создал класс BaseDao , который содержал повторяющиеся наборы методов @Insert и @Delete, поэтому не было очевидно, что я ошибся.

Библиотека ДОЛЖНА выдавать ошибку в этой ситуации, а не просто зависать ... это ошибка в библиотеке, я думаю.

...