我有一个字段Field<T>
。我想为该字段创建一个命名值,以便能够在查询中使用它。值的名称应该是该字段的名称。jOOQ - 为字段创建值
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"
这工作正常。然后,我遇到了问题时,淡水河谷不断为空:
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)
全部完成!
什么是用例?通常情况下,“Field field”是否来自表格的某个字段?所以你想用一个常量替换表列? –
@LukasEder这确实是一张桌子上的字段。它旨在用于'更新表集...选择...来自...'语句。 'select'子句中的一些投影是常量,这就是我想要使用上面的函数的地方。 –
嗯,但你不需要命名这些常量,是吗?也许,你能否用一个例子说明用例的“UPDATE”查询来更新你的问题? –