使用CONTAINS查询的PreparedStatement

3

我有一个查询需要连续运行28,000次,因此我认为使用preparedStatement可能是个聪明的想法。

这是我的查询:

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";

一切都很顺利,直到我们意识到模糊搜索方法在处理像“皮卡丘是我的英雄”这样的分隔单词时效果不佳,并建议在此情况下为“皮卡丘”、“是”、“我的”和“英雄”创建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错误: DRG-50900:第1行、第30列的文本查询解析器错误 DRG-50920:短语的一部分本身不是一个短语或等效物 DRG-50900:第1行、第30列的文本查询解析器错误 DRG-50920:短语的一部分本身不是一个短语或等效物
有任何建议吗? 我想知道这是否与in语句相同(无法创建“select * from pokemon where monster in (?)”)。谢谢!
1个回答

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 (?,?,?,?,?,?)...


谢谢,那其实是我的错误。现在完美运行! - Farid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接