2012-04-24 79 views
0

Grails提供derived properties使用公式映射參數生成SQL表達式字段:Grails的派生屬性逃離公式

static mapping = { 
    myfield formula: "field1 + field2" 
} 

我試圖用公式參數與PostgreSQL數據庫進行一個連接的字段。因爲PostgreSQL的8.4尚不支持CONCAT_WS的語法有點怪:

static mapping = { 
    myfield formula: "array_to_string(array[field1, field2],' ')" 
} 

在DataSource配置與loggingSql =真顯示的生產SQL已經表前綴插入一些奇怪的地方:

錯誤地出現
select table0_.field1 as field1_19_0_, 
     table0_.field2 as field2_19_0_,= 
     array_to_string(table0_.array[field1, table0_.field2], ' ') as formula0_0_ 
from test_table table0_ where table0_.id=? 

表前綴之前陣列但不FIELD1派生式中之前。有沒有辦法避免前綴或更明確地糾正這種行爲?

回答

2

這只是解析公式語法的問題。 GORM嘗試插入未加引號的表達式的表前綴,而不是隨後的parens,因此ARRAY []表示法會將其加入。

我的解決辦法是定義concat_ws function

CREATE OR REPLACE FUNCTION concat_ws(separator text, variadic str text[]) 
RETURNS text as $$ 
SELECT array_to_string($2, $1); 
$$ LANGUAGE sql; 

現在的GORM 參數可避免ARRAY []語法,並且如預期工作。

myfield formula: "concat_ws(' ', field1, field2)" 
0

我有一個非常類似的問題,並通過添加單引號周圍的事情,格姆試圖前綴解決了這個問題:

static mapping = 
{ 
    dayOfYear formula: " EXTRACT('DOY' FROM observed) " 
} 

格姆然後生成此,其工作:

select 
    EXTRACT('DOY' FROM observed) as y1_ 

這可能不適用於所有情況,但我希望它可以幫助某人。