Tablestore SDK for Java を使用すると、1 回のリクエストで 1 つ以上のテーブルから複数の行を読み取れます。各行は独立した結果を返すため、プライマリキーによって詳細レコードをバッチ取得できます。
前提条件
Tablestore SDK for Java をインストールし、クライアントを初期化します。
説明
public BatchGetRowResponse batchGetRow(BatchGetRowRequest batchGetRowRequest) throws TableStoreException, ClientException
1 つのリクエストで複数の行を読み取ります。 BatchGetRowRequest には、addMultiRowQueryCriteria を呼び出すことで追加される、1 つ以上の MultiRowQueryCriteria オブジェクトが含まれます。 各 MultiRowQueryCriteria は 1 つのテーブルを対象とします。 その条件内のすべての行は、maxVersions、columnsToGet、および filter などの同じクエリ条件を共有します。
サーバーは各行を個別に処理するため、ある行で失敗しても他の行には影響しません。行レベルの結果を確認するには、isAllSucceed、getSucceedRows、または getFailedRows を呼び出します。
1 回のBatchGetRow 呼び出しで、最大 100 行を取得できます。
次の例では、batch_get_demo テーブルからプライマリキーが row1 と row2 の 2 行を読み取り、各列の最新バージョンのみを返します。
String tableName = "batch_get_demo";
MultiRowQueryCriteria criteria = new MultiRowQueryCriteria(tableName);
// 行 1 のプライマリキーを追加
PrimaryKeyBuilder pkb1 = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pkb1.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
criteria.addRow(pkb1.build());
// 行 2 のプライマリキーを追加
PrimaryKeyBuilder pkb2 = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pkb2.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row2"));
criteria.addRow(pkb2.build());
criteria.setMaxVersions(1);
BatchGetRowRequest request = new BatchGetRowRequest();
request.addMultiRowQueryCriteria(criteria);
BatchGetRowResponse response = client.batchGetRow(request);
System.out.println("RequestId: " + response.getRequestId());
System.out.println("All Succeeded: " + response.isAllSucceed());
for (BatchGetRowResponse.RowResult rowResult : response.getSucceedRows()) {
System.out.println("Succeeded: " + rowResult.getRow());
}
if (!response.isAllSucceed()) {
for (BatchGetRowResponse.RowResult fail : response.getFailedRows()) {
System.out.println("Failed: table=" + fail.getTableName()
+ " index=" + fail.getIndex()
+ " error=" + fail.getError());
}
}
必須パラメーターは tableName、rowKeys、および maxVersions または timeRange のいずれかです。完全なスキーマについては、パラメーターテーブルをご参照ください。
パラメーター
MultiRowQueryCriteria は、単一テーブルのバッチクエリ条件を保持します。
|
名前 |
型 |
説明 |
|
tableName (必須) |
String |
読み取るテーブルの名前。 |
|
rowKeys (必須) |
List<PrimaryKey> |
|
|
maxVersions (いずれか必須) |
OptionalValue<Integer> |
読み取るバージョンの最大数。 カラムのバージョン数が |
|
timeRange (いずれか必須) |
OptionalValue<TimeRange> |
読み取る時間範囲。 各属性列は複数のバージョンを持つことができます。時間範囲を設定すると、Tablestore はその範囲内のバージョンのみを返します。 |
|
columnsToGet (任意) |
Set<String> |
読み取る列。プライマリキー列または属性列を指定できます。
|
|
filter (任意) |
OptionalValue<Filter> |
フィルター条件。詳細については、「フィルターの使用」をご参照ください。
|
シナリオ
複数テーブルにまたがる読み取り
1 つのリクエストで複数のテーブルから読み取るには、テーブルごとに 1 つの MultiRowQueryCriteria を作成し、addMultiRowQueryCriteria を使用してそれぞれをリクエストに追加します。
String tableA = "batch_get_demo";
String tableB = "batch_get_demo_2";
BatchGetRowRequest request = new BatchGetRowRequest();
// テーブル A のクエリ条件
MultiRowQueryCriteria criteriaA = new MultiRowQueryCriteria(tableA);
PrimaryKeyBuilder pkA = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pkA.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
criteriaA.addRow(pkA.build());
criteriaA.setMaxVersions(1);
request.addMultiRowQueryCriteria(criteriaA);
// テーブル B のクエリ条件
MultiRowQueryCriteria criteriaB = new MultiRowQueryCriteria(tableB);
PrimaryKeyBuilder pkB = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pkB.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("rowA"));
criteriaB.addRow(pkB.build());
criteriaB.setMaxVersions(1);
request.addMultiRowQueryCriteria(criteriaB);
BatchGetRowResponse response = client.batchGetRow(request);
System.out.println("Total succeeded rows: " + response.getSucceedRows().size());
フィルターを使用した読み取り
setFilter を呼び出して、条件に列値フィルターを設定します。この MultiRowQueryCriteria のすべての行で同じフィルターが使用され、Tablestore は一致する行のみを返します。
String tableName = "batch_get_demo";
MultiRowQueryCriteria criteria = new MultiRowQueryCriteria(tableName);
PrimaryKeyBuilder pkb1 = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pkb1.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
criteria.addRow(pkb1.build());
PrimaryKeyBuilder pkb2 = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pkb2.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row2"));
criteria.addRow(pkb2.build());
criteria.setMaxVersions(1);
// col1 が "val1" と等しい行のみを返す
SingleColumnValueFilter filter = new SingleColumnValueFilter(
"col1",
SingleColumnValueFilter.CompareOperator.EQUAL,
ColumnValue.fromString("val1"));
filter.setPassIfMissing(false);
criteria.setFilter(filter);
BatchGetRowRequest request = new BatchGetRowRequest();
request.addMultiRowQueryCriteria(criteria);
BatchGetRowResponse response = client.batchGetRow(request);
int matched = 0;
for (BatchGetRowResponse.RowResult rowResult : response.getSucceedRows()) {
if (rowResult.getRow() != null) {
matched++;
}
}
System.out.println("Rows matching filter: " + matched);