【问题标题】:Escaping formula for Grails derived propertiesGrails 派生属性的转义公式
【发布时间】:2012-04-24 17:19:27
【问题描述】:

Grails 提供derived properties 以使用 formula 映射参数从 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 之前。有没有办法转义前缀或更明确地纠正这种行为?

【问题讨论】:

    标签: postgresql grails grails-orm


    【解决方案1】:

    这只是解析公式语法的问题。 GORM 尝试为不带括号的不带引号的表达式插入表前缀,因此 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 formula 参数现在可以避免 ARRAY[] 语法,并且可以按预期工作。

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

    【讨论】:

      【解决方案2】:

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

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

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

      select
          EXTRACT('DOY' FROM observed)  as y1_
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-10
        • 1970-01-01
        • 1970-01-01
        • 2013-06-03
        • 2016-07-30
        • 2012-06-02
        • 2013-05-01
        • 1970-01-01
        相关资源
        最近更新 更多