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

SELECT *

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

jOOQ 支持投影中的星号运算符,包括限定星号(通过 Table.asterisk())和非限定星号(通过 DSL.asterisk())。如果省略投影,jOOQ 在生成的 SQL 中也可能出现星号,前提是 jOOQ 不知道所有列名。

每当 jOOQ 生成星号(显式地,或因为 jOOQ 不知道确切的投影)时,列的顺序和列集由数据库服务器定义,而不是 jOOQ。如果您正在使用生成的代码,这可能会导致问题,因为列的顺序可能与预期不同,并且投影的列数也可能过多或过少。

// Explicitly selects all columns available from BOOK - No asterisk
create.select().from(BOOK).fetch();

// Explicitly selects all columns available from BOOK and AUTHOR - No asterisk
create.select().from(BOOK, AUTHOR).fetch();
create.select().from(BOOK).crossJoin(AUTHOR).fetch();

// Renders a SELECT * statement, as columns are unknown to jOOQ - Implicit unqualified asterisk
create.select().from(table(name("BOOK"))).fetch();

// Renders a SELECT * statement - Explicit unqualified asterisk
create.select(asterisk()).from(BOOK).fetch();

// Renders a SELECT BOOK.* statement - Explicit qualified asterisk
create.select(BOOK.asterisk()).from(BOOK).fetch();
create.select(BOOK.asterisk(), AUTHOR.asterisk()).from(BOOK, AUTHOR).fetch();

对于以上所有语法,行类型(如下讨论)对 jOOQ 和 Java 编译器都是未知的。

嵌套表语法 不同,星号是通过 SQL 引擎(或必要时通过 jOOQ)将表的字段展平到周围的投影中来展开的。它不会嵌套表。

值得一提的是,在许多情况下,使用星号是查询效率低下的表现,因为如果不需要所有列,则会在客户端和服务器之间传输过多的数据,并且一些原本可以消除的连接也无法消除。有关更多信息,请参阅 本节

反馈

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

The jOOQ Logo