【问题标题】:How to use row value expressions in jOOQ?如何在 jOOQ 中使用行值表达式?
【发布时间】:2014-04-26 21:29:16
【问题描述】:

jOOQ 博客声称它是ten more common mistakes that Java developers make when writing SQL 之一,在受支持的情况下不使用行值表达式。

他们的建议是发出如下 SQL(而不是用 AND 链接几个单列条件):

SELECT c.address
FROM   customer c,
WHERE (c.first_name, c.last_name) = (?, ?)

SELECT c.first_name, c.last_name, a.street
FROM   customer c
JOIN   address a
ON  (c.id, c.tenant_id) = (a.id, a.tenant_id)

但是我如何在 jOOQ 中实际编码呢?

【问题讨论】:

    标签: java sql jooq


    【解决方案1】:

    Java 中对元组/记录的语言支持不足,您需要使用众多重载的 DSL.row() 方法之一。

    您的示例(来自问题)将转换为:

    // Assuming static imports:
    import static org.jooq.impl.DSL.row;
    import static your.generated.code.Tables.CUSTOMER;
    
    Customer c = CUSTOMER.as("c");
    Address a = ADDRESS.as("a");
    
    DSL.using(configuration)
       .select(c.ADDRESS)
       .from(c)
       .where(row(c.FIRST_NAME, c.LAST_NAME).eq("Jon", "Doe"))
       //         ^^^^^^^^^^^^  ^^^^^^^^^^^ <-> ^^^^^  ^^^^^ Types must match
       .fetch();
    
    DSL.using(configuration)
       .select(c.FIRST_NAME, c.LAST_NAME, a.STREET)
       .from(c)
       .join(a)
       .on(row(c.ID, c.TENANT_ID).eq(a.ID, a.TENANT_ID))
       //      ^^^^  ^^^^^^^^^^^ <-> ^^^^  ^^^^^^^^^^^ Types must match
       .fetch();
    

    在上面的示例中,Row2&lt;T1, T2&gt; DSL.row(Field&lt;T1&gt;, Field&lt;T2&gt;) 将适用,并确保左侧和右侧行值表达式具有相同的度数和类型。

    请注意,根据 SQL:1999 标准,ROW 是与&lt;row value constructor&gt; 一起使用的可选关键字,即ROW(a, b)(a, b) 相同。

    【讨论】:

    • 回复:“你的例子”。我的例子?还是你的?谁在写那个博客? ;-)
    • 回复:“你的例子”。你的。从问题:-)
    猜你喜欢
    • 2017-01-08
    • 2021-07-20
    • 2019-05-05
    • 2014-04-27
    • 2020-10-21
    • 2012-08-05
    • 2022-06-18
    • 2018-04-04
    • 1970-01-01
    相关资源
    最近更新 更多