java - 带有 CONTAINS 查询的 PreparedStatement

标签 java sql prepared-statement

我有一个需要连续运行 28000 次的查询,所以我认为使用 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模糊搜索“皮卡丘”"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 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

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

谢谢!

最佳答案

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

关于java - 带有 CONTAINS 查询的 PreparedStatement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7723601/

相关文章:

java - 使用 ControlBus 发送消息以打开 Spring Integration 入站适配器时出错

php - 如何在一个查询中更新多行

swift - 如何修复准备segue上的延迟数据?

php - mysqli_fetch_assoc()期望参数/调用成员函数bind_param()错误。如何获取并修复实际的mysql错误?

java - 通过事件添加带有 JTabbedPane 的新选项卡

java - 我收到此 "NullPointerException"错误

java - 读取图像时如何保持透明度不变? ( java )

sql - 不同的命令不起作用

mysql - 使用 WHERE 子句对 MySQL 中多个连接表中的不同行进行计数

mysql - 尝试使用存储过程在 MySQL 中创建 PIVOT,不会添加仅包含空记录的列