2016-08-31 634 views
2

我在帶有命名參數的Grails中使用Groovy Sql以從Postgres數據庫獲取結果。我的聲明是動態生成的,即連接成最終聲明,並隨着我一直沿着這些參數添加到地圖中。Groovy sql.rows返回org.postgresql.util.PSQLException:未安裝hstore擴展

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',' ')) 
} 

固定這個但這似乎有點不可思議(尤其是因爲如果我使用的,如果分支替換它不工作)。

我的問題是:爲什麼我真的得到這個錯誤信息,並有更好的方法來防止它發生?

+0

我的猜測是創造,是你的'sqlString'是'sql'?或者你有一些'def sqlString = sql.toString()'?如果你將一個'GString'傳遞給groovy sql,它會爲你引用'$ {...}',並且你最終會使用假SQL。 – cfrick

+0

檢查是否運行SQL幫助 - 「CREATE EXTENSION hstore;' – Rao

+0

嗨@cfrick,我有def String String sqlString作爲聲明,但它成爲一路上的GString。我現在在將'toString()'傳遞給'sql.rows'之前添加了一個'toString()',但錯誤仍然存​​在 – Roland

回答

0

這當然是groovy.sql.SQL實現中的一個錯誤。方法rows()不能處理空的地圖作爲params傳遞。作爲一種解決方法,您可以測試它並代之以傳遞一個空的列表

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

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

+2

GROOVY-8082現已解決。下一個版本2.4.9預計將在一兩週內發佈。您現在可以爲不需要替換佔位符值的情況指定空白地圖。 –