jOOQ——为领域创造价值
jOOQ - create value for field
我有一个字段 Field<T>
。我想为该字段创建一个命名值,以便能够在查询中使用它。值的名称应该是字段的名称。
select value as field from ...
这是正确的做法吗?
public <T> Field<T> namedValue(Field<T> field, T value) {
return DSL.val(value, field).as(field);
}
虽然它有效,但我想知道是否有更短的方法来做到这一点。我可能在这里很迂腐:)。
更新
我正在创建以下结构:
UPADTE table SET x = alias.x, y = alias.y
FROM (SELECT constant value for x, table2.y FROM table2 WHERE ...) AS alias.
让我们将其简化为(为了这个例子,着重于常量选择):
SELECT
FROM (SELECT constant value for x) AS alias.
首先,我开始于:
Select s1 = context.select(DSL.val("TEST"));
Select s2 = context.select(s1.fields()).from(s1);
这导致查询不正确:
select "alias_66794930"."TEST" from (select 'TEST') as "alias_66794930"
(我不确定这是否是 jOOQ 的正确行为。)
所以,我添加了一个别名:
Select s1 = context.select(DSL.val("TEST").as(X));
Select s2 = context.select(s1.fields()).from(s1);
这导致:
select "alias_76324565"."x" from (select 'TEST' as "x") as "alias_76324565"
这很好用。然后,我 运行 在常量值为 null 时遇到问题:
Select s1 = context.select(DSL.val(null).as(X));
Select s2 = context.select(s1.fields()).from(s1);
这导致:
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)
这是有道理的,字段类型未知。所以我添加了如下字段(及其类型):
Select s1 = context.select(DSL.val(null, X).as(X));
Select s2 = context.select(s1.fields()).from(s1);
现在绑定正确:
1678 [localhost-startStop-1] TRACE org.jooq.impl.DefaultBinding - Binding variable 1 : null (class java.lang.String)
全部完成!
我不认为你可以比现有的短很多。我的意思是,您的 SQL 显示为:
value as field
您的 Java/jOOQ 代码为:
DSL.val(value, field).as(field)
你当然可以静态导入 DSL.val
或 DSL.*
:
import static org.jooq.impl.DSL.*;
然后缩短为:
val(value, field).as(field)
如果您非常确定 value
的类型,则无需将其强制转换为 field
的类型
val(value).as(field)
现在,你绝对不能再短了,也不再需要你的 namedValue()
功能...
我有一个字段 Field<T>
。我想为该字段创建一个命名值,以便能够在查询中使用它。值的名称应该是字段的名称。
select value as field from ...
这是正确的做法吗?
public <T> Field<T> namedValue(Field<T> field, T value) {
return DSL.val(value, field).as(field);
}
虽然它有效,但我想知道是否有更短的方法来做到这一点。我可能在这里很迂腐:)。
更新
我正在创建以下结构:
UPADTE table SET x = alias.x, y = alias.y
FROM (SELECT constant value for x, table2.y FROM table2 WHERE ...) AS alias.
让我们将其简化为(为了这个例子,着重于常量选择):
SELECT
FROM (SELECT constant value for x) AS alias.
首先,我开始于:
Select s1 = context.select(DSL.val("TEST"));
Select s2 = context.select(s1.fields()).from(s1);
这导致查询不正确:
select "alias_66794930"."TEST" from (select 'TEST') as "alias_66794930"
(我不确定这是否是 jOOQ 的正确行为。)
所以,我添加了一个别名:
Select s1 = context.select(DSL.val("TEST").as(X));
Select s2 = context.select(s1.fields()).from(s1);
这导致:
select "alias_76324565"."x" from (select 'TEST' as "x") as "alias_76324565"
这很好用。然后,我 运行 在常量值为 null 时遇到问题:
Select s1 = context.select(DSL.val(null).as(X));
Select s2 = context.select(s1.fields()).from(s1);
这导致:
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)
这是有道理的,字段类型未知。所以我添加了如下字段(及其类型):
Select s1 = context.select(DSL.val(null, X).as(X));
Select s2 = context.select(s1.fields()).from(s1);
现在绑定正确:
1678 [localhost-startStop-1] TRACE org.jooq.impl.DefaultBinding - Binding variable 1 : null (class java.lang.String)
全部完成!
我不认为你可以比现有的短很多。我的意思是,您的 SQL 显示为:
value as field
您的 Java/jOOQ 代码为:
DSL.val(value, field).as(field)
你当然可以静态导入 DSL.val
或 DSL.*
:
import static org.jooq.impl.DSL.*;
然后缩短为:
val(value, field).as(field)
如果您非常确定 value
的类型,则无需将其强制转换为 field
val(value).as(field)
现在,你绝对不能再短了,也不再需要你的 namedValue()
功能...