postgresql - Grails衍生属性的转义公式

标签 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=?

表前缀错误地出现在数组之前,但不在派生公式中的field1之前。有没有办法转义前缀或更明确地纠正此行为?

最佳答案

这只是解析公式语法的问题。 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公式参数可以避免使用ARRAY []语法,并且可以按预期工作。
myfield formula: "concat_ws(' ', field1, field2)"

关于postgresql - Grails衍生属性的转义公式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10302817/

相关文章:

hibernate - grails自定义GORM方言阻止 'grails shell'起作用-类路径之谜

postgresql - 如何确保所有 Postgres 查询都有 WHERE 子句?

sql - 在 PostgreSQL 中使用 group by 时如何获取最后一条记录

grails - Grails Web-flow 中的重定向

database-design - GORM ID的生成和belongsTo关联?

debugging - Intellij 想法 在不停止完整调试的情况下停止执行函数

postgresql - Postgres : how to start a procedure right after database start?

postgresql - 具有超过 1 个变音符号的字符的 Postgres UNACCENT

grails - Grails 3.1.5配置文件:rest-api不需要持久性

grails - Grails在其他数据源中创建域对象