2015-08-21 111 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「(請參閱原始問題的編輯)正確。這就是爲什麼我必須添加別名。 –