2015-08-21 75 views
3

我有一个字段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) 

全部完成!

+0

什么是用例?通常情况下,“Field field”是否来自表格的某个字段?所以你想用一个常量替换表列? –

+0

@LukasEder这确实是一张桌子上的字段。它旨在用于'更新表集...选择...来自...'语句。 'select'子句中的一些投影是常量,这就是我想要使用上面的函数的地方。 –

+0

嗯,但你不需要命名这些常量,是吗?也许,你能否用一个例子说明用例的“UPDATE”查询来更新你的问题? –

回答

5

我不认为你能比你已经拥有的短得多。我的意思是,你的SQL写着:

value as field 

而且你的Java/jOOQ代码读取:

DSL.val(value, field).as(field) 

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

import static org.jooq.impl.DSL.*; 

再缩短事到:

val(value, field).as(field) 

如果你非常肯定value的类型,你不需要它强制到的field

val(value).as(field) 

现在,你绝对不能再短,也没有更多的需要为您的namedValue()功能...

+0

谢谢您的确认!现在唯一尚未解决的问题是,如果jOOQ对查询“选择”alias_66794930“。”TEST“(选择'TEST')作为”alias_66794930“(请参阅原始问题的编辑)正确。这就是为什么我必须添加别名。 –