【问题标题】:PreparedStatement with CONTAINS query带有 CONTAINS 查询的 PreparedStatement
【发布时间】:2011-12-05 03:12:53
【问题描述】:

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

一切正常,直到我们意识到模糊方法对于像“pikachu is my hero”这样的拆分词表现不佳,建议在这种情况下创建 4 模糊搜索“pikachu”“is”我的英雄'。不确定这是否属实,但因为我将运行查询 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 文本错误: DRG-50900:第 1 行第 30 列的文本查询解析器错误
DRG-50920:短语的一部分本身不是短语或等价物
DRG-50900:第 1 行第 30 列的文本查询解析器错误
DRG-50920:短语的一部分本身不是短语或等价物

有什么建议吗? 我想知道这是否与 in 语句相同(不可能从 pokemon where monster in (?) 创建 select *)

谢谢!

【问题讨论】:

    标签: java sql prepared-statement


    【解决方案1】:

    当你在java中使用prepared statement时,它会根据你使用的方法设置参数。所以

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

    【讨论】:

    • 谢谢,这实际上是我的错误。现在完美运行!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 2011-05-12
    相关资源
    最近更新 更多