Java-ORM工具JOOQ之表命名寫法

當您從生成的別名表執行表別名和間接引用字段時,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();


分享到:


相關文章: