2012-04-24 84 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_ 

这可能不适用于所有情况,但我希望它可以帮助某人。