想定環境
この記事では下記のようなテーブルを作成したとして説明します。
- テーブルの構造は「ハッシュキー:id、レンジキー:a、通常のアトリビュート:v」
- このテーブルに対して、「ハッシュキー:v、レンジキー:a」というグローバルインデックスを設定(このインデックス名を「v-a-index」とする)
記述例
例を下記に示しますが、悩みどころはアノテーションの書き方でしたね。複数のアノテーションの書き方に悩みました。あとは、通常の検索方法と変わらないと思います。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//// 以下、マッパークラス抜粋 | |
//@DynamoDBRangeKey(attributeName="a") | |
@DynamoDBRangeKey | |
@DynamoDBIndexRangeKey(attributeName="a",globalSecondaryIndexName ="v-a-index") | |
public String getAItem() { | |
return relation; | |
} | |
public void setRItem(String relation) { | |
this.relation = relation; | |
} | |
//@DynamoDBIndexHashKey(attributeName="v") | |
@DynamoDBAttribute | |
@DynamoDBIndexHashKey(attributeName="v",globalSecondaryIndexName="v-a-index") | |
public String getValue() { | |
return this.value; | |
} | |
///// ここまでマッパークラスの記述 | |
//// 以下検索の例 | |
DynamoDBQueryExpression<DynaItem> expression = new DynamoDBQueryExpression<DynaItem>(); | |
expression.withConsistentRead(false); | |
// 利用するグローバルセカンダリインデックス名を指定 | |
expression.withIndexName("v-a-index"); | |
// Hash キーの指定 | |
DynaItem dti = new DynaItem(); | |
dti.setValue(value); //vがハッシュキーになる点に注意 | |
expression.withHashKeyValues(dti); | |
// Range キーの指定 | |
expression.withRangeKeyCondition("a", new Condition().withComparisonOperator( | |
ComparisonOperator.BEGINS_WITH.toString()).withAttributeValueList( | |
new AttributeValue().withS(aValue))); //レンジキーであるaの値をここに入力 | |
// 検索結果を取得 | |
List<DynaItem> res = mapper.query(DynaItem.class,expression); |