在 Spring 上,如何使用 JPA 和组合键(分区键和排序键)查询 DynamoDB 表?

2024-01-12

我有一个使用 JPA 和 Spring Data DynamoDB 设置的 Spring 项目。工作正常。我可以通过分区键和排序键(称为DynamoDBHashKey and DynamoDBRangeKey).

我的问题是我的存储库的设置方式是使用读取表query and scan操作,而不是get-item操作起来,应该会更有效率。

这是我的实体:

import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.data.annotation.Id;

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@DynamoDBTable(tableName = "my-entity-table")
public class MyEntity {

    @Id
    @DynamoDBHashKey 
    @DynamoDBAttribute(attributeName = "partition_key")
    private String partitionKey;

    @Id
    @DynamoDBRangeKey
    @DynamoDBAttribute(attributeName = "sort_key")
    private String sortKey;

    ...
}

这是我的存储库:

import org.socialsignin.spring.data.dynamodb.repository.EnableScan;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

@EnableScan
@Repository
public interface MyEntityRepository extends CrudRepository<MyEntity, String> {
    List<MyEntity> findByPartitionKeyAndSortKey(String partitionKey, String sortKey);
}

如何配置我的实体和存储库以使用以下命令从表中读取项目get-item当我的表同时具有分区键和排序键时操作?


做了一些研究后,我偶然发现了这两篇文章:

  1. 复合主键 Kotlin 示例 https://github.com/derjust/spring-data-dynamodb/wiki/Composite-Primary-Keys-Kotlin-Example
  2. 具有哈希和范围键 DynamoDB 表的 Spring Data JPA http://johnhunsley.blogspot.com/2016/11/spring-data-jpa-with-hash-range-key.html

第一个解释了如何在 Kotlin 中做我想做的事情。不错,但它不完全是我想要的。

第二个完美地达到了目标,基本上它说的是我需要为我的实体对象创建一个主键对象,如下所示:

import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBDocument;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBIgnore;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBRangeKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.data.annotation.Id;

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@DynamoDBTable(tableName = "my-entity-table")
public class MyEntity {

    @Id
    @DynamoDBIgnore
    private PrimaryKey primaryKey;

    ...

    @DynamoDBHashKey
    @DynamoDBAttribute(attributeName = "partition_key")
    public String getPartitionKey() {
        return primaryKey != null ? primaryKey.getPartitionKey() : null;
    }

    public void setPartitionKey(final String partitionKey) {
        if (primaryKey == null) {
            primaryKey = new PrimaryKey();
        }
        primaryKey.setPartitionKey(partitionKey);
    }

    @DynamoDBRangeKey
    @DynamoDBAttribute(attributeName = "sort_key")
    public String getSortKey() {
        return primaryKey != null ? primaryKey.getSortKey() : null;
    }

    public void setSortKey(final String sortKey) {
        if (primaryKey == null) {
            primaryKey = new PrimaryKey();
        }
        primaryKey.setSortKey(sortKey);
    }

    @Getter
    @Setter
    @NoArgsConstructor
    @AllArgsConstructor
    @DynamoDBDocument
    public static class PrimaryKey {
        @DynamoDBHashKey 
        @DynamoDBAttribute(attributeName = "partition_key")
        private String partitionKey;

        @DynamoDBRangeKey
        @DynamoDBAttribute(attributeName = "sort_key")
        private String sortKey;
    }
}

然后,我不需要在我的存储库类上创建任何自定义查询方法:

@EnableScan
@Repository
public interface MyEntityRepository extends 
        CrudRepository<MyEntity, MyEntity.PrimaryKey> {

}

之后,只需使用 JPA 即可CrudRepository获取物品的方法如下:

final MyEntity.PrimaryKey myEntityPK 
    = new MyEntity.PrimaryKey("partitionKey", "sortKey");

final MyEntity myEntity = myEntityRepository.findById(myEntityPK)
    .orElseThrow(() -> ... );

为了验证它实际上正在使用get-item操作而不是scan and query操作时,可以在以下类上放置几个断点(截至spring-data-dynamodb-5.1.0):

  • org.socialsignin.spring.data.dynamodb.core.DynamoDBTemplate
  • org.socialsignin.spring.data.dynamodb.repository.support.SimpleDynamoDBCrudRepository
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Spring 上,如何使用 JPA 和组合键(分区键和排序键)查询 DynamoDB 表? 的相关文章

随机推荐

  • 段落中每个单词的第一个字母的样式

    我正在尝试使用样式设置段落的第一个字母CSS并想使用 greensock 添加一些动画 但实际上要求是设置每个单词的第一个字母的样式 而不仅仅是第一个字母段落 对此有何建议 想法 p font size 150 color 000000 p
  • 根据url隐藏div

    抱歉 如果这是另一个转发 我一直在尝试寻找解决方案 但我尝试过的任何方法都不起作用 我正在使用一个我可以完全控制 html 的博客 我通常可以找到基本 html 的方法 但当涉及到 Java 或 CSS 时 我完全是个新手 抱歉 我什么都不
  • 获取程序图标

    我正在制作一个类似资源管理器的应用程序来浏览存储在我的计算机上的文件 我的应用程序将处于 图标 视图中 问题是 如何显示exe文件的图标 有几种方法可以做到这一点 最简单的可能是添加对System Drawing并利用Icon Extrac
  • 找不到 unicode 右箭头

    Unicode 中有这些箭头 但它缺少一个正确的 名字应该是这样的RIGHTWARDS BLACK ARROW 但没有该名称的 Unicode 字符 有一些字符看起来很相似 但我找不到合适的匹配项 我正在寻找该集合的右指向字符 基于字符名称
  • 使用 pip 安装 lxml 失败

    我正在尝试使用 pip 安装 lxml 我有 Windows 11 和 Python 版本 python 3 10 2 amd64 我也在使用 Visual Studio Code VSC 我意识到我需要 lxml 从我的 VSC 终端中的
  • 正则表达式/lastIndex - 意外行为

    我知道有一些正则表达式 lastIndex差异 但这对我来说是新的 预期行为 创建一个新的正则表达式 带有文字 构造函数 显然会创建一个带有lastIndex属性设置为零 实际行为 在 FF Chrome 中 lastIndex 属性似乎在
  • 如何从嵌套数据结构(例如解析 JSON)中提取单个值?

    我编写了一些代码来从 Web API 获取数据 我能够从 API 解析 JSON 数据 但得到的结果看起来相当复杂 这是一个例子 gt gt gt my json name ns1 timeSeriesResponseType declar
  • 如何在实体框架中创建表和视图之间的关系

    我有一个由 Visual Studio 2008 向导基于 Sql Server 2008 数据库生成的实体框架模型 该模型有一个视图 该视图在逻辑上通过连接表 通过插入 更新触发器在数据库中强制执行 与另一个表以多对多关系连接 表和视图都
  • 相互比较两个 REST 服务

    有人对编写比较两个 REST 服务的测试有什么建议吗 我们这样做是作为回归测试的一种形式 我希望能做一些类似的事情 向两个服务发送 1 的 GET 并比较结果 向两个服务发送 POST 并比较结果 向两个服务发送 PUT 并比较结果 这个想
  • WPF TextBox 不接受输入,空格和退格键有效

    我在用户控件内有文本框 并使用以下 XAML 将用户控件添加到 MainWindow
  • EventSourcing 应用程序中的用户身份验证

    我正在考虑使用 DDD CQRS EventSourcing 制作一个应用程序 但在弄清楚如何进行用户身份验证时遇到了一些麻烦 用户本质上是我的领域的一部分 因为他们对客户负责 我正在使用 ASP NET MVC 4 并且我希望只使用 Si
  • 多选 jQuery 中 json 的来源

    我有 jQuery 的多选 我想从 json 获取源代码 我从我的自动完成组合框中获取了有效的源代码 但在这里它不起作用 My code document ready function var warning message select
  • 如何获取在从属设备上执行的管道阶段内的 Jenkins 主 IP/主机名?

    我有一个 Jenkins 声明式管道 我在一个阶段进行构建 并在另一阶段在不同的机器上进行测试 我还有一个 Selenium 集线器与 Jenkins master 在同一台机器上运行 pipeline agent none stages
  • 在代码隐藏的html控件中设置值而不进行服务器控制

    在代码隐藏的html控件中设置值而不进行服务器控制
  • ssh 多个命令将问号附加到文件名

    我有一个数据库传输脚本 它使用 bzip2 来最大限度地减少服务器上大型数据库的锁定 第一行是 ssh root server mysqldump db bzip2 gt root db sql bz2 这适用于许多服务器 但在新的 Ubu
  • 是否有一个字段存储在正则表达式中使用的精确字段分隔符 FS,相当于 RS 的 RT?

    In GNU Awk 的 4 1 2记录分割gawk https www gnu org software gawk manual gawk html gawk split records我们可以读到 When RS是单个字符 RT包含相同
  • 再次弹出“应用程序想要使用您当前的位置”对话框[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以手动调用警报 允许使用当前位置 https stackoverflow com questions 3749648 is it possible to call alert allow to
  • 包含重复序列的数字到唯一排列映射

    我正在寻找一种可以将数字映射到序列的唯一排列的算法 由于类似的问题 我发现了莱默代码和阶乘系统 快速排列 gt 数字 gt 排列映射算法 https stackoverflow com questions 1506078 fast perm
  • 使用Python获取活动窗口

    我想使用 python 在屏幕上获取活动窗口 例如路由器的管理界面 输入用户名和密码为admin 我想使用 python 捕获该管理界面来自动输入用户名和密码 为了做到这一点 我需要进口什么 在 Windows 上 您可以使用 python
  • 在 Spring 上,如何使用 JPA 和组合键(分区键和排序键)查询 DynamoDB 表?

    我有一个使用 JPA 和 Spring Data DynamoDB 设置的 Spring 项目 工作正常 我可以通过分区键和排序键 称为DynamoDBHashKey and DynamoDBRangeKey 我的问题是我的存储库的设置方式