可用版本: Dev (3.21) | 最新版 (3.20) | 3.19 | 3.18 | 3.17 | 3.16 | 3.15 | 3.14 | 3.13 | 3.12 | 3.11

零基与一基API

适用于 ✅ 开源版   ✅ 专业版   ✅ 企业版

任何连接两种语言/思维模式的 API(例如 Java/SQL)都不可避免地面临寻找一致的策略来解决“基于”问题。数组应该是从 1 开始还是从 0 开始?

显然,Java 是从 0 开始的,而 SQL 是从 1 开始的,jOOQ 的最佳策略是保持这种方式。如果这让您感到困惑,您应该记住以下一系列规则

所有 SQL API 都是从 1 开始的

当使用 SQL API 时,例如基于索引的 ORDER BY 子句,或 窗口函数(如下例所示),jOOQ 不会解释索引,而是将其原样发送到 SQL 引擎。例如

SELECT nth_value(title, 3) OVER (ORDER BY id)
FROM book
ORDER BY 1
create.select(nthValue(BOOK.TITLE, 3).over(orderBy(BOOK.ID)))
      .from(BOOK)
      .orderBy(1).fetch();

在上面的例子中,我们正在寻找按 Y 排序的 T 中 X 的第 3 个值。显然,这个窗口函数使用从 1 开始的索引。ORDER BY 子句也是如此,它按第 1 列(再次是从 1 开始计数)对结果进行排序。SQL 中没有第 0 列。

所有 jOOQ API 都是从 0 开始的

jOOQ 是一个 Java API,因此,尽管 JDBC 是从 1 开始的(见下文),但从 1 开始会非常令人惊讶。例如,当您在 jOOQ org.jooq.Result 中按索引访问记录时,鉴于结果扩展了 java.util.List,您将使用从 0 开始的索引访问

Result<?> result = create.select(BOOK.ID, BOOK.TITLE)
      .from(BOOK)
      .orderBy(1)
      .fetch();

for (int i = 0; i < result.size(); i++)
    System.out.println(result.get(i));

与 JDBC 不同,在 JDBC 中 java.sql.ResultSet#absolute(int) 将底层游标定位在从 1 开始的索引处,我们 Java 开发人员真的不喜欢这种思维方式。从上面的循环中可以看出,我们像遍历任何其他 Java 集合一样遍历此结果。

所有 JDBC API 都是从 1 开始的

上述规则的一个例外是,显然,所有 JDBC 接口的 jOOQ API。例如,当您实现 自定义数据类型绑定时,您将直接从 jOOQ 中使用 JDBC API,它是从 1 开始的。

反馈

您对此页面有任何反馈吗? 我们很乐意听到您的意见!

The jOOQ Logo