我在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也不行)。
我的问题是:为什么我真的收到此错误消息,是否有更好的方法可以防止它出现?
答案 0 :(得分:2)
这肯定是groovy.sql.SQL实现中的一个错误。方法rows()
无法处理以params
传递的空地图。作为解决方法,您可以对其进行测试并传递空的列表。
def paramsMap = [:]
...
if (paramsMap.isEmpty())
paramsMap= []
创建的问题