spring - 使用 Spring JPA 规范相对于直接查询有哪些优势

标签 spring jpa spring-data-jpa

我目前正在开发一个项目,我必须根据一些过滤器从数据库中检索一些行(我还必须对它们进行分页)。

我的解决方案是创建一个生成查询并直接查询数据库的函数(它有效并且速度很快)

当我向高级程序员提出这个解决方案时,他告诉我这会起作用,但这不是一个长期的解决方案,我应该使用 Spring 规范。

现在我的问题是:

  1. 为什么 Spring 规范比生成查询更好?

  2. Spring 规范生成的查询比普通查询更快吗?

  3. 使用硬编码查询有那么重要吗?

  4. 有更好的方法来解决这个问题吗?

我不得不提的是,数据库中的表并没有存储大量数据,应用程序启动一年后,最大的表(查询最少的表)大约有 134.000 行。 这些表在我们将用来过滤的行上有索引。

最佳答案

  1. “生成查询的函数”听起来像是通过根据条件连接较小的部分来构建查询字符串。即使假设这是一个 JPQL 查询字符串,而不是依赖于数据库的 native SQL 字符串,也存在几个问题:
  • 如果您重构过实体,您将失去 IDE 的帮助
  • 不容易模块化和重用查询生成逻辑的部分(例如,如果您想提取一种方法,将相同的条件添加到一堆具有不同表连接和别名的不同查询中)
  • 很容易因拼写错误而破坏查询语法(例如“a=b”+“and c=d”)
  • 更难调试
  • 如果您的查询是 native SQL,那么您也会依赖于数据库(例如,也许您希望集成测试在内存数据库上运行,而生产代码在常规数据库上运行)
  • 如果在您的项目中所有查询都以某种方式生成,但您的项目以不同的方式生成(没有充分的理由),那么维护将会更加困难
  • JPA 框架会针对最常见的用例生成优化的查询,因此一般来说,您从规范查询中获得的速度至少与从 native 查询中获得的速度相同。有时您需要编写 native SQL 来进一步优化查询,但这些都是特殊情况。
  • 是的,这种不好的做法会让维护成为一场噩梦
  • 关于spring - 使用 Spring JPA 规范相对于直接查询有哪些优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68283776/

    相关文章:

    java - 如何删除节点以及所有相关节点而不仅仅是关系--neo4j cypher 1.8

    java - id 列和 JPA 的问题

    java - JPA:反向级联删除

    java - JPA 属性覆盖

    spring-boot - 如何在用户-角色-权限中配置oneToMany映射

    java - 错误由: java. lang.ClassNotFoundException : org. springframework.security.context.DelegatingApplicationListener引起

    java - 从 Nexus 部署 Artifact 的正确方法

    java - Spring + Maven + .properties 文件

    java - Spring-Data-Jpa - 清空带有外键的表

    java - Spring Data 2.0.x AuditorAware getCurrentUser 方法抛出 AbstractMethodError