我目前正在开发一个项目,我必须根据一些过滤器从数据库中检索一些行(我还必须对它们进行分页)。
我的解决方案是创建一个生成查询并直接查询数据库的函数(它有效并且速度很快)
当我向高级程序员提出这个解决方案时,他告诉我这会起作用,但这不是一个长期的解决方案,我应该使用 Spring 规范。
现在我的问题是:
为什么 Spring 规范比生成查询更好?
Spring 规范生成的查询比普通查询更快吗?
使用硬编码查询有那么重要吗?
有更好的方法来解决这个问题吗?
我不得不提的是,数据库中的表并没有存储大量数据,应用程序启动一年后,最大的表(查询最少的表)大约有 134.000 行。 这些表在我们将用来过滤的行上有索引。
最佳答案
- “生成查询的函数”听起来像是通过根据条件连接较小的部分来构建查询字符串。即使假设这是一个 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/