基于集合的思考
适用于 ✅ 开源版 ✅ 专业版 ✅ 企业版
您在使用 JPA 和 jOOQ 之间可能遇到的许多概念差异并非技术特定的,而在于您如何思考数据库交互。 这两种方法都不是“最佳”方法,这两种方法都更适合某些用例。 这里讨论的方法是
- 处理实体状态转换(JPA 的优势所在)
- 处理数据集转换(jOOQ / SQL 的优势所在)
典型的应用程序将同时具有以上两种问题,或者其中一种类型的问题更多。 重要的是要认识到,如果您确实同时遇到这两种问题,那么将这两种类型的技术并排使用是完全没问题的! 使用 jOOQ 和使用 JPA 并非互斥。
话虽如此,当遵循基于集合思考的 SQL 范例时,jOOQ 的使用效率最高。即 不要这样做
FOR rec IN (SELECT id FROM book WHERE title LIKE 'A%') LOOP UPDATE book SET last_update = CURRENT_TIMESTAMP WHERE book.id = rec.id; END LOOP;
而是这样做
UPDATE book SET last_update = CURRENT_TIMESTAMP WHERE title LIKE 'A%';
该示例特意没有使用任何 Java 甚至 JPA 代码来展示基于集合的思考不严格与编写 SQL 相关联的想法。 第一个示例通过 PL/SQL 代码暴露了 N+1 问题。 在某些情况下,在单个逐行基础上实现实体状态转换可能完全没问题,但在很多情况下,将您的数据视为数据集并运行批量查询会更好。
深入了解这种区别不在本参考手册的范围内。 掌握这两种方法需要大量的实践。 但是,当您想要从 JPA 切换到 jOOQ 时,请务必记住这种区别。 jOOQ 拥抱基于集合思考的 SQL 范例,当您想最有效地使用 jOOQ 时,您也应该这样做。
反馈
您对此页面有任何反馈吗? 我们很乐意听取您的意见!