转义Grails派生属性的公式

时间:2012-04-24 17:19:27

标签: postgresql grails gorm

Grails提供derived properties使用公式映射参数从SQL表达式生成字段:

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

我正在尝试将公式参数与PostgreSQL数据库一起使用来创建连接字段。语法有点奇怪,因为PostgreSQL 8.4还不支持concat_ws:

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

在DataSource配置中使用 loggingSql = true 显示的生成的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=?

表前缀错误地出现在 array 之前,但不出现在派生公式中的 field1 之前。有没有办法逃避前缀或更明确地纠正这种行为?

2 个答案:

答案 0 :(得分: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)"

答案 1 :(得分:0)

我遇到了一个非常类似的问题,并通过在GORM尝试添加前缀的内容周围添加单引号来解决这个问题:

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

然后GORM产生了这个,它起作用了:

select
    EXTRACT('DOY' FROM observed)  as y1_

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