2016-08-24 4 views
1

現在、LSIとdynamoDBマッパークラスを使用してダイナモDBテーブルから情報をロードしようとしています。私は次のコードLSIとマッパーでdynamodbを照会する方法

Conisderこのクラス

class Employee { 
    @DynamoDBHashKey 
    public String getID() { 
     return ID; 
    } 
    @DynamoDBRangeKey 
    public String getFirstName() { 
     return firstName; 
    } 

    @DynamoDBIndexRangeKey(localSecondaryIndexName = "my-lsi") 
    public String getLastName() { 
    return lastName; 
    } 

    public String getMyotherfield() { 
    return myotherfield; 
    } 
} 

があるとLSIとDynamoDBのマッパー

Employee obj = new Employee(); 
obj.setID("221"); 
obj.setLastName("SOMEONE"); 
DynamoDBQueryExpression<Employee> queryExpression = new DynamoDBQueryExpression<>(); 
queryExpression.setHashKeyValues(obj); 
queryExpression.setIndexName("my-lsi"); 
queryExpression.setProjectionExpression("myotherfield"); 

PaginatedQueryList<Employee> paginatedQueryList = mapper.query(Employee.class, queryExpression); 
Iterator<Employee> iterator = paginatedQueryList.iterator(); 
while (iterator.hasNext()) { 
    Employee pp = iterator.next(); 
    // some code 
} 

を使用して情報を取得するためのコードのこの部分を考えてみましょう[EDIT] これは正しい方法ですマッパー付きのクエリLSI? LSIとdynamoDBMapperを使用してテーブルからデータをフェッチするより良い方法は何ですか? (パフォーマンス面で)

私もこのhttps://java.awsblog.com/post/Tx3GYZEVGO924K4/The-DynamoDBMapper-Local-Secondary-Indexes-and-Youが見つかりましたが、その2013年のリンクです。私は、LSIとマッパーでのクエリに関する最新のドキュメントを見つけることができません。

+0

あなたは「より良い方法」と言ったときに正確に何を探していますか?それはパフォーマンスの面でですか?ページネーションに関しては? – Dasharath

答えて

2

あなたが指定したコードでは、範囲キーをまったく設定していないことに注意してください。これを行うにはqueryExpression.setRangeKeyConditions()を使用してください。ここ

は、コードサンプルである:

Map<String, Condition> rangeKeyConditions = new HashMap<>(); 
rangeKeyConditions.put("lastName", new Condition() 
       .withComparisonOperator(ComparisonOperator.EQ) 
       .withAttributeValueList(new AttributeValue().withS("SOMEONE"))); 
queryExpression.setRangeKeyConditions(rangeKeyConditions);` 

[更新]:

、オブジェクト(OBJ)範囲キー値( "誰か")を設定するのに十分な(も必要)ではありませんそのオブジェクトはhashKeyの設定にのみ使用されるためです。例を見てくださいhere

+0

** queryExpression **に** indexName **を設定しました。また、** obj **に** lastName **フィールドを設定しました。十分ではありませんか?現在の方法は私には解決策を提供しますが、これがLSIを使用したクエリの最良の方法であるかどうかはわかりません。 (パフォーマンスと正解の両方の点で) –

+0

rangeKeyConditionsを使用する必要がありますか? –

+0

DynamoDBクエリでは、範囲キーを指定することはオプションです。あなたの場合は、last-name(my-lsiの範囲キー)に基づいて照会したいので、この範囲キーを指定する唯一の方法はra​​ngeKeyConditions()メソッドを使用することです。正解を得るという点では、これが唯一の方法です。また、 'queryPage()'を見てみることもできます。 'query'と' queryPage'の違いについては、ここで説明します:http://stackoverflow.com/a/32800303/2491766 – Dasharath

関連する問題