jOOQ - 为字段创造价值

Kev*_*ote 3 sql api alias jooq

我有一个领域Field<T>.我想为该字段创建一个命名值,以便能够在查询中使用它.值的名称应该是字段的名称.

select value as field from ...
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?

public <T> Field<T> namedValue(Field<T> field, T value) {
    return DSL.val(value, field).as(field);
}
Run Code Online (Sandbox Code Playgroud)

虽然它有效,但我想知道是否有更短的方法来做到这一点.我可能在这里迂腐:).

更新

我正在创建以下构造:

UPADTE table SET x = alias.x, y = alias.y
FROM (SELECT constant value for x, table2.y FROM table2 WHERE ...) AS alias.
Run Code Online (Sandbox Code Playgroud)

让我们简化一下(为了这个例子,专注于常量选择):

SELECT
FROM (SELECT constant value for x) AS alias.
Run Code Online (Sandbox Code Playgroud)

首先,我开始:

Select s1 = context.select(DSL.val("TEST"));
Select s2 = context.select(s1.fields()).from(s1);
Run Code Online (Sandbox Code Playgroud)

这导致查询不正确:

select "alias_66794930"."TEST" from (select 'TEST') as "alias_66794930"
Run Code Online (Sandbox Code Playgroud)

(我不确定这是否是jOOQ的正确行为.)

所以,我添加了一个别名:

Select s1 = context.select(DSL.val("TEST").as(X));
Select s2 = context.select(s1.fields()).from(s1);
Run Code Online (Sandbox Code Playgroud)

这导致:

select "alias_76324565"."x" from (select 'TEST' as "x") as "alias_76324565"
Run Code Online (Sandbox Code Playgroud)

这很好用.然后,当常量值为null时,我遇到了问题:

Select s1 = context.select(DSL.val(null).as(X));
Select s2 = context.select(s1.fields()).from(s1);
Run Code Online (Sandbox Code Playgroud)

这导致:

select "alias_85795854"."x" from (select cast(? as varchar) as "x") as "alias_85795854"
1400 [localhost-startStop-1] TRACE org.jooq.impl.DefaultBinding  - Binding variable 1       : null (class java.lang.Object)
Run Code Online (Sandbox Code Playgroud)

这是有道理的,字段类型是未知的.所以我添加了字段(及其类型)如下:

Select s1 = context.select(DSL.val(null, X).as(X));
Select s2 = context.select(s1.fields()).from(s1);
Run Code Online (Sandbox Code Playgroud)

绑定现在是正确的:

1678 [localhost-startStop-1] TRACE org.jooq.impl.DefaultBinding  - Binding variable 1       : null (class java.lang.String)
Run Code Online (Sandbox Code Playgroud)

全部完成!

Luk*_*der 6

我认为你不会比现有的短得多.我的意思是,你的SQL读取:

value as field
Run Code Online (Sandbox Code Playgroud)

您的Java/jOOQ代码如下:

DSL.val(value, field).as(field)
Run Code Online (Sandbox Code Playgroud)

您当然可以静态导入DSL.valDSL.*:

import static org.jooq.impl.DSL.*;
Run Code Online (Sandbox Code Playgroud)

然后缩短到:

val(value, field).as(field)
Run Code Online (Sandbox Code Playgroud)

如果你非常确定你value的类型,你不需要强迫它的类型field

val(value).as(field)
Run Code Online (Sandbox Code Playgroud)

现在,你绝对不能再短了,而且你的namedValue()功能也不再需要...