Groovy sql.rows返回org.postgresql.util.PSQLException:没有安装hstore扩展

时间:2016-08-31 09:33:17

标签: postgresql grails groovy

我在Grails中使用带有命名参数的Groovy Sql来获取Postgres DB的结果。我的语句是动态生成的,即连接成最终语句,并且在我继续时将params添加到地图中。

sqlWhere += " AND bar = :namedParam1"
paramsMap.namedParam1 = "blah"

为了便于阅读,我使用了groovy字符串语法,它允许我在多行上编写我的sql语句,如下所示:

sql = """
      SELECT *
      FROM foo
      WHERE 1=1
      ${sqlWhere}
      """

表达式被评估为包含换行符的字符串\ n:

SELECT *\n ...

当我像这样传递params时,这不是问题

results = sql.rows(sqlString, paramsMap)

但如果paramsMap为空(由于AND bar = :namedParam1并不总是连接到查询中,因此会发生这种情况)。然后我收到错误

org.postgresql.util.PSQLException: No hstore extension installed  

这似乎与问题的真实性质无关。我现在用if ... else

修复了这个问题
if (sqlQuery.params.size() > 0) {
    results = sql.rows(sqlString, paramsMap)
} else {
    results = sql.rows(sqlString.replace('\n',' '))
}

但这看起来有点奇怪(特别是因为如果我在if-branch中使用replace也不行)。

我的问题是:为什么我真的收到此错误消息,是否有更好的方法可以防止它出现?

1 个答案:

答案 0 :(得分:2)

这肯定是groovy.sql.SQL实现中的一个错误。方法rows()无法处理以params传递的空地图。作为解决方法,您可以对其进行测试并传递空的列表

def paramsMap = [:]
...
if (paramsMap.isEmpty())
    paramsMap= []

https://issues.apache.org/jira/browse/GROOVY-8082

创建的问题