2

以下はエンティティクラスです


  @Entity(defaultKeyspace = CASSANDRA_KEYSPACE)
  @CqlName(CASSANDRA_TABLE)
  public static class Scientist implements Serializable {

    @CqlName("person_name")
    public String name;

    @Computed("writetime(person_name)")
    @CqlName("name_ts")
    public Long nameTs;

    @CqlName("person_id")
    @PartitionKey
    public Integer id;

    public Scientist() {}

    public Scientist(int id, String name) {
      super();
      this.id = id;
      this.name = name;
    }

    public Integer getId() {
      return id;
    }

    public void setId(Integer id) {
      this.id = id;
    }


    public String getName() {
      return name;
    }

    public void setName(String name) {
      this.name = name;
    }

    @Override
    public String toString() {
      return id + ":" + name;
    }

    @Override
    public boolean equals(@Nullable Object o) {
      if (this == o) {
        return true;
      }
      if (o == null || getClass() != o.getClass()) {
        return false;
      }
      Scientist scientist = (Scientist) o;
      return id.equals(scientist.id) && Objects.equal(name, scientist.name);
    }

    @Override
    public int hashCode() {
      return Objects.hashCode(name, id);
    }
  }

  @Dao
  public interface ScientistDao {
  @GetEntity
  MappedAsyncPagingIterable<Scientist> map(AsyncResultSet resultSet);

  @Delete
  CompletionStage<Void> deleteAsync(Scientist entity);

  @Insert
  CompletionStage<Void> saveAsync(Scientist entity);
}

直面する問題は、計算フィールド (上記の場合は writetime(person_name) ) がクエリの一部として選択されていない場合、マッピングが失敗することです。

3.x ドライバー: ResultSet に存在しないマップされたフィールドは無視されました。リンク

4.x ドライバーの場合: 各エンティティ フィールドについて、データベース テーブルまたは UDT には、対応する名前の列が含まれている必要があります。リンク

この計算フィールドを必要に応じてクエリの一部にすることができ、IllegalArgumentException をスローすることなくマッピングが正常に行われる解決策/回避策を提案してください。

編集:

科学者テーブル スキーマ

CREATE TABLE beam_ks.scientist (person_id int PRIMARY KEY,person_name text);

以下は、試したクエリです。

   select person_id,writetime(person_name) as name_ts from beam_ks.scientist where person_id=10

@GetEntity を使用した結果セットのマッピングは、次のエラーで失敗します。

Caused by: java.lang.IllegalArgumentException: person_name is not a column in this row
    at com.datastax.oss.driver.internal.core.cql.DefaultRow.firstIndexOf(DefaultRow.java:110)
    at com.datastax.oss.driver.api.core.data.GettableByName.get(GettableByName.java:144)
    at org.apache.beam.sdk.io.cassandra.CassandraIOTest_ScientistHelper__MapperGenerated.get(CassandraIOTest_ScientistHelper__MapperGenerated.java:89)

CassandraIOTest_ScientistHelper__MapperGenerated の get メソッド:

  @Override
  public CassandraIOTest.Scientist get(GettableByName source) {
    CassandraIOTest.Scientist returnValue = new CassandraIOTest.Scientist();

    Integer propertyValue = source.get("person_id", Integer.class);
    returnValue.setId(propertyValue);

    String propertyValue1 = source.get("person_name", String.class);
    returnValue.setName(propertyValue1);
    return returnValue;
  }

また、ドキュメントでは、計算された値に getter および setter メソッドを追加するかどうかを指定していません。したがって、それらはエンティティクラスから削除されます

4

1 に答える 1