具有CONTAINS查询的PreparedStatement

时间:2011-10-11 08:59:51

标签: java sql prepared-statement

我有一个需要连续运行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";

Everthings工作正常,直到我们意识到模糊方法对于像“皮卡丘是我的英雄”这样的分裂词并不能很好地表现出来并且建议创建,在这种情况下,4'模糊搜索'pikachu''是''我的英雄'。不确定这是否属实,但由于我将运行查询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";

在这种情况下,?将设置为:

  

'模糊({伯纳姆},70,4,重量),模糊({投资者},70,4,重量),模糊({信托},70,4,重量)'

查询似乎很好,在sql dev上运行。但是,使用Java,我收到以下错误:

  

ORA-20000:Oracle Text错误:   DRG-50900:第1行第30列的文本查询解析器错误   DRG-50920:短语的一部分本身不是短语或等同词   DRG-50900:第1行第30列的文本查询解析器错误   DRG-50920:短语的一部分本身不是短语或等同物

有什么建议吗? 我想知道这是否与in语句中的情况相同(不可能从(?)中的怪物创建一个select * from pokemon

谢谢!

1 个答案:

答案 0 :(得分: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 (?,?,?,?,?,?) ...