はじめに
Spring BootでDynamoDBを利用した際にrange key (sort key)の利用方法を調べたので、こちらにメモします。
drejust氏のサンプルを参考に作成してます。
サンプルコード
githubのサンプルコードです。全体像が知りたい方はこちらをご覧ください。
EC2で動作確認しました。
spring-dynamodb-range-key
ポイント
pom.xml
spring-data-dynamodbを利用してますが、io.github.boostchicken氏のspring-data-dynamodbを利用してます。
※derjust氏のspring-data-dynamodb等でも動作するかもしれません。
entity
entityは2つ作成する必要があります。
1つはhash key (partition key)とrange key (sort key)をまとめたもの、1つはもう一方のKeyをまとめたEntityをKeyとするEntityです。
後者のEntityはlombokではなく、setter・ getterは自前で作成する必要がある部分があるためご注意ください。
PkEntity.java
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBRangeKey; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @AllArgsConstructor @NoArgsConstructor @Data @Builder public class PkEntity {     /**      * Hash Key (partition key)      */     @DynamoDBHashKey     private String sampleHashKey;     /**      * Range Key (sort key)      */     @DynamoDBRangeKey     private String sampleRangeKey; } | 
Entity.java
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBRangeKey; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Data; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import org.springframework.data.annotation.Id; @Data @DynamoDBTable(tableName = "sample-table") @AllArgsConstructor @NoArgsConstructor public class Entity {     @Id     @Getter(AccessLevel.NONE)     @Setter(AccessLevel.NONE)     private PkEntity pkEntity;     @DynamoDBHashKey(attributeName = "sampleHashKey")     public String getSampleHashKey() {         return pkEntity != null ? pkEntity.getSampleHashKey() : null;     }     public void setSampleHashKey(String sampleHashKey) {         if (pkEntity == null) {             pkEntity = new PkEntity();         }         pkEntity.setSampleHashKey(sampleHashKey);     }     @DynamoDBRangeKey(attributeName = "sampleRangeKey")     public String getSampleRangeKey() {         return pkEntity != null ? pkEntity.getSampleRangeKey() : null;     }     public void setSampleRangeKey(String sampleRangeKey) {         if (pkEntity == null) {             pkEntity = new PkEntity();         }         pkEntity.setSampleRangeKey(sampleRangeKey);     }     private String sampleAttribute; } |