使用 Java 8 谓词的 JPA 存储库过滤器

2024-04-15

我在使用 Spring Boot 的一次面试测试中有一个要求,我必须创建一个端点,该端点接受一堆可选请求参数,然后根据这些参数(如汽车型号、车牌、发动机类型、制造商)返回汽车列表、司机、租赁公司等。汽车、司机和制造商都是独立的实体。

我在 JPARepository 中使用单个 JPQL 查询实现了此功能,该查询实现了 LEFT JOINS 并在 where 子句中进行过滤,例如 licensePlate = licensePlateParameter OR licensePlatParameter is null 等。

该解决方案正在发挥作用,但面试官表示该解决方案具有可扩展性和可维护性。我应该使用谓词来实现它。有人可以向我展示一个示例,如何使用更易于维护的谓词来实现此类功能?一些带有代码的示例将不胜感激。

我认为我很聪明,通过检查参数是否为空来满足可选参数并在一次调用中找到记录。与我想到的另一个问题相关的是,从数据库获取所有记录然后使用谓词过滤它真的是一个很好的做法吗?另外,当涉及多个对象/实体时,我们如何进行过滤,可以为单个类型创建谓词。

@Query("SELECT d FROM Driver d LEFT JOIN d.car c WHERE (d.name = :name OR :name is null) "
            + "and (c.licensePlate = :licensePlate OR :licensePlate is null) "
            + "and (c.rating = :rating OR :rating is null) " and so on

    List<Driver> findByAttributes(@Param("name") String name, 
            @Param("licensePlate") String licensePlate,
            @Param("rating") Integer rating,
            and so on);

Spring 有一个围绕 JPA 标准 API(使用谓词)的包装器,称为规范 API。

编写规范时可以执行以下操作,为每个条件编写规范:

public static Specification<Car> withLicensePlate(String licensePlate) {
    return (root, query, cb) -> licensePlate == null ? null : cb.equal(root.get("licensePlate"), licensePlate);
}

public static Specification<Car> withRating(String rating) {
    return (root, query, cb) -> rating == null ? null : cb.equal(root.get("rating"), rating);
}

public static Specification<Car> withName(String name) {
    return (root, query, cb) -> name == null ? null : cb.equal(root.get("name"), name);
}

它还允许您编写连接操作:

public static Specification<Car> withSeatType(String type) {
    return (root, query, cb) -> {
        return type == null ? null : cb.equal(root.join("interior", JoinType.LEFT).get("type"), type);
    };
}

您可以返回null在一个标准内,它允许您使这些规范成为“可选”。之后,您可以使用Specifications.where()结合这些标准:

 Specification<Car> spec = Specifications
      .where(withLicensePlate(licensePlate))
      .and(withRating(rating))
      .and(withName(name))
      .and(withSeatType(seatType));

如果您像我在本例中那样编写单独的规范,则可以在必要时重新使用它们。否则,您将不得不编写特定于操作的规范,而面试官也可能会发现这种规范无法扩展。

编写规范后,您必须从JpaSpecificationExecutor界面并使用findAll(Specification) method.

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

使用 Java 8 谓词的 JPA 存储库过滤器 的相关文章

  • 杰克逊.将缺失的属性反序列化为空Optional

    假设我有一堂这样的课 public static class Test private Optional
  • iText7:如何获取段落的实际宽度

    在添加到文档之前 我需要知道段落的宽度 以磅为单位 我在这里搜索并找到了 Alexey 关于段落高度的答案 所以我用宽度做了它 但它不起作用 无论段落有多长 始终返回矩形的宽度 我尝试了这段代码 private float getRealP
  • 32 位数字中 1 的数量

    我正在寻找一种在 32 位数字中包含 1 数量的方法 之间不使用循环 任何人都可以帮助我并向我提供代码或算法吗 这样做 提前致谢 See Integer bitCount int http java sun com javase 6 doc
  • 如何操作指定列上的 JTable 返回值?

    我有一个 JTable 有两列 可编辑的JTable 当用户在第二列中输入内容时 我的要求如下 用户只能输入数字和逗号 当用户输入错误字符时 会发出蜂鸣声 Toolkit getDefaultToolkit beep 我该如何实现这一目标
  • 如何找出已使用的 JAR?

    在更大的项目中 我们可能会使用大量的 JAR 如何找出项目 而不是整个项目 中的某个模块 包正在使用哪些 JAR 有什么工具 技术等吗 较大的项目通常使用类似的构建工具maven http maven apache org or ant h
  • Encog - 如何加载神经网络的训练数据

    The NeuralDataSet我在实际中看到的对象除了 XOR 之外什么都没有 它只是两个小数据数组 我无法从文档中找出任何内容MLDataSet 似乎所有内容都必须立即加载 但是 我想循环遍历训练数据 直到到达 EOF 然后将其算作
  • 如何使 java.text.NumberFormat 将 0.0d 格式设置为“0”而不是“+0”?

    需要带符号的结果 0 0d 除外 IE 123 45d gt 123 45 123 45d gt 123 45 0 0d gt 0 我调用format setPositivePrefix 在 DecimalFormat 的实例上 强制结果中
  • 当目标是属性时,@Throws 不起作用

    在看的同时这个问题 https stackoverflow com q 47737288 7366707 我注意到申请 Throws to a get or setuse site 没有影响 此外 唯一有效的目标 for Throws ar
  • 关于java中同步的问题;何时/如何/到什么程度

    我正在开发我的第一个多线程程序 并在同步的几个方面陷入困境 我已经浏览了 oracle sun 主页上的多线程教程 以及这里的一些关于 SO 的问题 所以我相信我知道什么是同步 然而 正如我提到的 有几个方面我不太确定如何弄清楚 我以明确问
  • 具有 JPA、PostgreSQL 和 NULL 值的 JodaTime

    我试图将 JPA 的 JodaTime DateTime 字段保留到 PostgreSQL 但遇到了指向数据库 NULL 值的空指针的问题 我正在使用 NetBeans 7 beta 2 IDE 持久性实现是 EclipseLink 2 2
  • 清理 IntelliJ 中构建的 Play 框架

    我有一个拼写错误conf routes文件导致 Play Framework 生成错误命名的类 重建项目并运行Invalidate Caches并没有解决 IntelliJ 中的问题 当我手动运行时重新生成了不正确的类文件play clea
  • Java SWT 用户输入验证

    在 SWT 中进行用户输入验证时 Java 约定是什么 我读到有 FieldEditors 它们是非常方便的字段 但遗憾的是仅适用于首选项和对话框 我还了解到有一个 IValidator 接口 但它经常与数据绑定一起使用 就我而言 我的大多
  • Spring的@PreDestroy导致随机记录而不记录

    我正在使用 Spring 并且在终止时我让 PreDestroy 清理 bean 我不明白为什么日志记录有时会成功 而有时会失败 Using Log4j2 Logger log LogManager getLogger MyClass cl
  • Spring Data (JPA) 多个存储库,没有很多类

    在我当前的项目中 我使用 Spring Data JPA 并且有 20 多个 Entity类 我想为它们创建存储库 但创建另一个类 每个类适用于任何模型 Repository注释似乎是某种矫枉过正和大量 重复 代码 所有存储库类将如下所示
  • Java ZIP - 如何解压缩文件夹?

    是否有任何示例代码 如何将 ZIP 中的文件夹部分解压到我想要的目录中 我已将文件夹 FOLDER 中的所有文件读取到字节数组中 如何从其文件结构创建 我不确定你所说的部分是什么意思 您的意思是在没有 API 帮助的情况下自己完成吗 如果您
  • 使用 https 的 Java Jersey RESTful Web 服务

    我是 Java EE 的新手 正在开发一个 RESTful API 其中每个 API 调用用户都会发送编码的凭据 我的问题是如何通过默认的 http 实现 https 协议并确保我的连接安全 我正在使用 Jersey Restful Web
  • Spring-data-cassandra:创建名称为“sessionFactory”的 bean 时出错,并且无法解析对 bean“cassandraTemplate”的引用

    我有一个 springboot 应用程序 在其中连接到 cassandra DB 我的 pom xml parent gt
  • 使用基于Optional内容的流

    我从不受我控制的服务获取可能为空的地图 并且想要处理它 比方说 过滤 映射并减少到我需要的单个元素 问题 是否有从Optional到Stream的 链接 我尝试过 除其他外 return Optional ofNullable getMap
  • JAXB 枚举字段未序列化

    我有以下课程 package dictionary import java io Serializable import java util Objects import javax xml bind annotation XmlEleme
  • 如何在服务器上获取球衣日志?

    我正在使用球衣进行 REST WS 如何在服务器端启用球衣日志 很长的故事 我收到客户端异常 但我在 tomcat 日志中没有看到任何内容 它甚至没有到达我的方法 由于堆栈跟踪显示 toReturnValue 它确实从服务器获取了一些内容

随机推荐

  • SessionId/身份验证令牌生成的最佳实践

    我见过有人使用 UUID 来生成身份验证令牌 然而 在RFC 4122 http www ietf org rfc rfc4122 txt据称 不要假设 UUID 很难猜测 不应该使用它们 作为安全功能 仅拥有即可授予的标识符 访问 例如
  • C - 我使用什么选项来生成列表文件?

    我是 C 编程语言和 gcc 的新手 我正在尝试破译一个相当复杂的 C 程序 我想阅读一个有用的列表文件而不是源文件 我正在寻找由 gcc 编译器创建的列表文件 其中包含 所有包含的源代码 xref 交叉引用列表 变量声明位置的引用 例如
  • Asp.Net Core API 禁用启动完成消息

    作为我的应用程序的一部分 我有一个 Net Core API 项目 与该项目作为自己的进程运行的大多数情况不同 我让 API 在线程等单个进程中运行 另外 对于我的项目 我实现了一个自定义日志系统来满足我的需求 但是 我遇到了一个小问题 每
  • 如何将accessibilityIdentifier设置为UIAlertController?

    这就是我简单创建的方式UIAlertController并将其呈现在屏幕上 private class func showAlertWithTitle title String message String let alert UIAler
  • 使用 gdb 在指定的可执行文件之外单步执行汇编代码会导致错误“无法找到当前函数的边界”

    我在 gdb 的目标可执行文件之外 甚至没有与该目标对应的堆栈 无论如何 我想单步执行 以便我可以验证汇编代码中发生了什么 因为我不是 x86 汇编方面的专家 不幸的是 gdb 拒绝进行这种简单的汇编级调试 它允许我设置并停止在适当的断点上
  • 如何以相反的顺序遍历 boost::dynamic_bitset ?

    有没有办法以相反的顺序遍历 boost dynamic bitset 我的意思是我们通常通过 find first 找到第一个设置位 然后使用 find next 继续 是否有任何相应的 find last 和 find prev 或任何其
  • Angular Elements / Zone.js 事件侦听器减慢主页速度

    我们有一个 Angular 7 项目 它使用 Angular 元素生成自定义元素 此自定义元素用于 React 项目和 AngularJS 项目 当自定义元素的代码加载到这些项目之一中时 即使自定义元素没有渲染到 DOM 中 网站速度也会减
  • sequelize Model.hasOne 错误:模型未与 ModelTwo 关联

    我已将sequelizejs 集成到我的express 框架中 我配置了所有模型 并尝试用它构建我的第一个查询 我不断收到错误 错误 模型未与 ModelTwo 关联 app get function req res db Member f
  • 错误“无法加载 Boto 的 S3 绑定。”

    我遵循了提供的非常简洁的指南Django 存储 http django storages readthedocs org en latest backends amazon S3 html 从本地文件存储转换 并遇到了此异常 无法加载 Bo
  • 空查询时的最大返回值

    我有这样的疑问 int maxShoeSize Workers Where x gt x CompanyId 8 Max x gt x ShoeSize 将会有什么maxShoeSize如果8号公司根本没有工人呢 UPDATE 如何更改查询
  • 格式 xml,漂亮的打印

    我知道有两种 漂亮打印 或格式化 xml 的方法 外壳工具 http www shell tools net 技巧 38 使用通用身份样式表和 Xalan 漂亮打印 XML http etutorials org XML xml hacks
  • 以函数作为模板参数的部分特化拒绝

    得到了这段代码 该代码可以与以前版本的 gcc 一起编译良好 template
  • 有没有办法获取历史 YouTube 订阅者信息?

    目前 我正在通过以下请求检索每日订阅者信息 var videoOptions part snippet contentDetails statistics id videoIds Send request youtube videos li
  • Jquery UI 结合了可排序和可拖动

    我正在尝试组合一个可拖动面板 顶部 和一个可排序面板 底部 拖动工作正常 但排序失败 这是我的 JS 小提琴 http jsfiddle net dmUKY 9 http jsfiddle net dmUKY 9 拖放和排序功能共享drop
  • Objective C 中的继承问题

    我创建了一个 SDMutableGrid 类 以便我可以使用网格 它只是 NSMutableArray 的子级 其中包含的数组数等于网格中的行数 目前 程序在真正启动之前就退出了 似乎是因为为 NSMutableArray 定义的方法在某种
  • 通过控制台应用程序连接到 Oracle,不能通过 Web 服务连接

    我无法通过 asmx Web 服务连接到 Oracle 模式 而可以通过控制台应用程序 x86 连接到 Oracle 模式 代码 var conn new OracleConnection Data Source xe User ID my
  • 将多个值插入隐藏字段

    我有一个选择列表 您可以在其中选择多个城市 选择城市时 我想将邮政编码添加到隐藏字段 我现在的解决方案将值插入到隐藏字段 但是 当 fx 时它会覆盖该值 单击一个新城市 它应该只附加到值中 例如 value value1 value2 va
  • 为 Flask 应用提供服务是否需要 WSGI 服务器和 HTTP 服务器?

    使用 uWSGI 和 Nginx 设置 Flask 可能很困难 我尝试以下这个 DigitalOcean 教程 https www digitalocean com community tutorials how to serve flas
  • ASP.Net WebApi STA 模式

    This post http weblog west wind com posts 2012 Sep 18 Creating STA COM compatible ASPNET Applications使 WebApi 无法在 STA 模式
  • 使用 Java 8 谓词的 JPA 存储库过滤器

    我在使用 Spring Boot 的一次面试测试中有一个要求 我必须创建一个端点 该端点接受一堆可选请求参数 然后根据这些参数 如汽车型号 车牌 发动机类型 制造商 返回汽车列表 司机 租赁公司等 汽车 司机和制造商都是独立的实体 我在 J