2011-10-11 50 views
3

我有一個查詢需要連續運行28000次,所以我認爲使用preparedStatement可能是一個聰明的想法。PreparedStatement with CONTAINS查詢

這裏是我的查詢:

String requestWithFirstName = "SELECT SE.ELEMENT_ID, SE.LASTNAME||' '||SE.FIRSTNAME AS ELEMENT, (SCORE(1)+SCORE(2))/2 AS SCORE " 
         + "FROM BL_SUSPICIOUS_ELEMENT SE " 
         + "WHERE CONTAINS(SE.LASTNAME, 'fuzzy({' || ? || '},' || ? || ',' || ? || ', weight)' , 1)>0 " 
         + "AND CONTAINS(SE.FIRSTNAME, 'fuzzy({' || ? || '},' || ? || ',' || ? || ', weight)' , 2)>0 " 
         + (type > 0 ? "AND SE.ELEMENT_TYPE_ID = ?" : "") 
         + " ORDER BY SCORE DESC"; 

Everthings工作得很好,直到我們意識到,模糊方法並不像分裂的話表現良好「皮卡丘是我心目中的英雄」,它是建議創建的,在這情況下,4模糊搜索'皮卡丘''是''我的''英雄'。不確定這是否是真實的,但因爲我將運行28 000次查詢,這是一個很好的機會看到它的行動。

於是,我就修改以這種方式查詢:

"SELECT A.ELEMENT_ID, A.LASTNAME||' '||A.FIRSTNAME AS AKA, SCORE(1) AS SCORE " 
     + "FROM BL_AKA A, BL_SUSPICIOUS_ELEMENT SE " 
     + "WHERE CONTAINS(A.LASTNAME, ?, 1)>0 " 
     + "AND SE.ELEMENT_ID = A.ELEMENT_ID " 
     + (type > 0 ? "AND SE.ELEMENT_TYPE_ID = ?": "") 
     + " ORDER BY SCORE DESC"; 

在這種情況下,?將被設置爲:

'fuzzy({Burnham},70,4,weight),fuzzy({Investors},70,4,weight),fuzzy({Trust},70,4,weight)'

查詢似乎很好,在sql dev上運行。但是,對於Java,我得到以下錯誤:

ORA-20000: Oracle Text error: DRG-50900: text query parser error on line 1, column 30
DRG-50920: part of phrase not itself a phrase or equivalence
DRG-50900: text query parser error on line 1, column 30
DRG-50920: part of phrase not itself a phrase or equivalence

有什麼建議嗎? 我不知道這是否與在聲明中的情況相同(不可能創建一個select * from怪獸在(?))

謝謝!

回答

4

當您在java中使用預準備語句時,它將根據您使用的方法設置參數。所以

String s = "'fuzzy({Burnham},70,4,weight),fuzzy({Investors},70,4,weight),fuzzy({Trust},70,4,weight)'"; 
statement.setString(s); 

將再次逃脫,結果:

'''fuzzy({Burnham},70,4,weight),fuzzy({Investors},70,4,weight),fuzzy({Trust},70,4,weight)''' 

嘗試設置參數不帶引號。

您可以創建IN (?)聲明。但是你將不得不爲每個參數添加一個問號:WHERE monster IN (?,?,?,?,?,?) ...

+0

謝謝,那實際上是我的錯誤。現在完美的工作! – Farid