2014-03-13 48 views
0

當在Postgres FTS中使用Hibernate時,tsquery看起來是合適的。但是,每次嘗試輸入「'」或其他一些奇怪字符的混合時,似乎都會出現主題異常。它甚至不接受兩個詞。如果用單引號括住字符串,則布爾運算符如|停止工作。我想知道是否有辦法處理這個異常。我爲每一種方法都添加了投擲,但它似乎把我的頭撞在牆上。這是我的代碼:在tsquery中處理SQLGrammarException:ERROR:語法錯誤:

"SELECT FROM cat c where "+ args.get(0)+" @@ "+ "to_tsquery("+ args.get(1) + ")"; 

這就是Hibernate產生的。

"Hibernate: select fulltextse0_.name as name2_ from posts fulltextse0_ where 
    fulltextse0_.textsearchable_index_col @@ to_tsquery(?)=true order by 
    fulltextse0_.id asc limit ?" 

arg0是fulltext字段的名稱,arg1是從Web窗體傳遞給它的字符串。

+0

顯示您的代碼。 –

+0

@CraigRinger補充。謝謝。 – Noah

+0

因此,您將代碼轉換爲使用'to_tsquery'參數的參數?上面顯示的代碼似乎與Hibernate生成的SQL不匹配。如果您將用戶輸入字符串直接替換爲SQL,則應將其顯示在SQL中,而不是作爲放置參數('?')插入。 –

回答

2

您的代碼未能遵循SQL的基本正確慣例,即:不要將用戶提供的數據直接替換爲SQL字符串。這會給你打開SQL injection的漏洞,也會引起各種令人興奮的錯誤。你已經發現了錯誤,幸虧有人利用你的數據庫。

Use parameterized statements

+0

這似乎沒有回答這個問題。這是示例代碼,我知道你在說什麼。但它不能解決我的問題。 – Noah

+0

真的嗎?編輯問題以顯示代碼生成的實際SQL,用於工作和非工作情況。然後我們會看到。 (當你添加信息時在這裏評論)。 –

+0

發表我的代碼。請看看它。 – Noah