當您從生成的別名表執行表別名和間接引用字段時,jOOQ代碼生成器的強度變得更
加明顯。 這可以通過示例最好地顯示:
-- Select all books by authors born after 1920,
-- named "Paulo" from a catalogue:
SELECT *
FROM author a
JOIN book b ON a.id = b.author_id
WHERE a.year_of_birth > 1920
AND a.first_name
---------------------
// Declare your aliases before using them in SQL:
Author a = AUTHOR.as("a");
Book b = BOOK.as("b");
// Use aliased tables in your statement
create.select()
.from(a)
.join(b).on(a.ID.eq(b.AUTHOR_ID))
.where(a.YEAR_OF_BIRTH.gt(1920)
.and(a.FIRST_NAME.eq("Paulo")))
.orderBy(b.TITLE)
.fetch();
正如您在上面的示例中所看到的,在生成的表上調用as()會返回與表相同類型的
對象。 這意味著生成的對象可用於從別名表中取消引用字段。 在Java編譯器檢查
SQL語句的語法方面,這非常強大。 如果從表中刪除列,則從該表別名中取消引用
該列將導致編譯錯誤。
從其他表表達式中取消引用列
只有少數表表達式提供瞭如上所示的SQL語法類型安全性,其中使用了生成的表。
但是,大多數表通過field()方法公開它們的字段:
// "Type-unsafe" aliased table:
Table> a = AUTHOR.as("a");
// Get fields from a:
Field> id = a.field("ID");
Field> firstName = a.field("FIRST_NAME");派生列列表
SQL標準指定了如何一次重命名/別名表及其列。 它引用了以下語法的術語“派生
列列表”(例如Postgres支持):
SELECT t.a, t.b
FROM (
SELECT 1, 2
) t(a, b)
此功能在各種用例中很有用,在這些用例中,列名稱不是事先知道的(
但是表的度數是!)。 一個例子是unnested表,或VALUES()表構造函數:
-- Unnested tables
SELECT t.a, t.b
FROM unnest(my_table_function()) t(a, b)
-- VALUES() constructor
SELECT t.a, t.b
FROM VALUES(1, 2),(3, 4) t(a, b)
只有少數數據庫真的支持這樣的語法,但幸運的是,jOOQ可以使用UNION ALL和指
定新列名稱的空虛擬記錄輕鬆模擬它。 這兩個陳述是等價的:
-- Using derived column lists
SELECT t.a, t.b
FROM (
SELECT 1, 2
) t(a, b)
-- Using UNION ALL and a dummy record
SELECT t.a, t.b
FROM (
SELECT null a, null b FROM DUAL WHERE 1 = 0
UNION ALL
SELECT 1, 2 FROM DUAL
) t在jOOQ中,您只需指定列別名的varargs列表:
// Unnested tables
create.select().from(unnest(myTableFunction()).as("t", "a", "b")).fetch
();
// VALUES() constructor
create.select().from(values(
row(1, 2),
row(3, 4)
).as("t", "a", "b"))
.fetch();
閱讀更多 IT碼將 的文章