以下はエンティティクラスです
@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 メソッドを追加するかどうかを指定していません。したがって、それらはエンティティクラスから削除されます