超过 22 列的 jOOQ 查询示例

dan*_*elc 6 java sql jooq

我正在寻找如何执行超过 22 行的 jOOQ 查询的示例。

http://www.jooq.org/doc/latest/manual/sql-building/column-expressions/row-value-expressions/

告诉我这是可能的,但我还没找到例子。

有人能指出我正确的方向吗?

Luk*_*der 6

从 jOOQ 3.7 开始(目前没有计划改变这一点),22 是可以以类型安全方式获取的最大列数。超过 22 后,您仍然可以执行查询,但 jOOQ 的 API 将不再跟踪您的记录类型。例如:

// Still type safe
Result<Record22<Integer, String, ..., Integer>> result =
DSL.using(configuration)
   .select(INT_COLUMN1, STRING_COLUMN2, ..., INT_COLUMN22)
   .from(TABLE)
   .fetch();

// Add one more column, and "lose" type safety
Result<Record> result =
DSL.using(configuration)
   .select(INT_COLUMN1, STRING_COLUMN2, ..., INT_COLUMN22, STRING_COLUMN23)
   .from(TABLE)
   .fetch();
Run Code Online (Sandbox Code Playgroud)

从 API 用户的角度来看,无论您选择 22 列或更少的列(安全类型),还是选择 23 列或更多列(无类型安全),API 的“感觉”都完全相同。

UNION 失去类型安全性

UNION当您将类型安全查询与非类型安全查询进行比较时,差异可能会变得最明显:

// Still type safe
Result<Record22<Integer, String, ..., Integer>> result =
DSL.using(configuration)
   .select(INT_COLUMN1, STRING_COLUMN2, ..., INT_COLUMN21)
   .from(TABLE)
   .union(
//  ^^^^^ compilation error here
    select(INT_COLUMN1, STRING_COLUMN2, ..., INT_COLUMN21, INT_COLUMN22)
   .from(TABLE))
   .fetch();

// Add one more column, and "lose" type safety
Result<Record> result =
DSL.using(configuration)
   .select(INT_COLUMN1, STRING_COLUMN2, ..., STRING_COLUMN23)
   .from(TABLE)
   .union(
//  ^^^^^ This compiles, even if it's wrong
    select(INT_COLUMN1, STRING_COLUMN2, ..., STRING_COLUMN23, STRING_COLUMN24)
   .from(TABLE))
   .fetch();
Run Code Online (Sandbox Code Playgroud)

  • 答案就在互联网上。这个数字是相当随机的(毫不奇怪)。对于大多数语言来说,你必须在某个地方停下来。或者,正如比尔·盖茨曾经说过的:“22 个元组属性应该足以满足每个人的需求”* (3认同)