2012-09-22 77 views
0

任何人都可以幫助從HQL中的NOT(!)符號中逃脫。我正在使用Postgres 8.3。此外,我卻無法使用這些字符來搜索?| \'()如何逃離'!' HQL中的符號

fts('english',COLUMN_NAME,'" + searchText + "') = true) 
+0

對於FTS,它會起作用嗎? –

+0

標題是誤導我猜。 –

+0

您應該閱讀SQL注入指南並查看您的整個代碼庫。 https://www.owasp.org/index.php/SQL_Injection –

回答

3

你應該binding搜索文本,而不是手動串聯它來查詢。它不僅可以解決您的問題,而且在安全性(SQL注入)和性能方面也更好(數據庫可以看到具有不同參數的相同查詢,這樣可以在編譯查詢可以時緩存)。

更改您的查詢,以便它看起來像:

fts('english', COLUMN_NAME, :searchText) = true // using named parameters 
// or 
fts('english', COLUMN_NAME, ?) = true // using positional parameters 

然後,您可以正確地綁定您的參數:

session.createQuery(hqlQuery) 
     .setString("searchText", searchText) 
     .iterate(); 
// or 
session.createQuery(hqlQuery) 
     .setString(0, searchText) 
     .iterate(); 

這是相同的原則,使用與JDBC一個PreparedStatement和設置參數(主要區別在於參數的索引從JDBC開始,1開始,HQL開始爲0。

+0

我仍然收到以下錯誤。 原因:org.postgresql.util.PSQLException:錯誤:在tsquery中沒有操作數:「!」。 –

+0

這是因爲您沒有將有效查詢傳遞給全文搜索。這是PostgreSQL問題,而不是Hibernate問題。無論如何,全文搜索通常會引起詞幹擾,因此標點符號將被刪除,您將無法將其包含在搜索中。也許你應該使用['to_tsquery()'](http://www.postgresql.org/docs/8.3/static/functions-textsearch.html)將你的搜索文本包裝成正確的查詢。 –

+0

@RamarajKaruppusamy對於SQL注入,請參閱http://en.wikipedia.org/wiki/SQL_injection和http://bobby-tables.com/ –