PreparedStatement с запросом CONTAINS - PullRequest
       2

PreparedStatement с запросом CONTAINS

3 голосов
/ 11 октября 2011

У меня есть запрос, который нужно будет запускать 28 000 раз подряд, поэтому я подумал, что использование prepareStatement, вероятно, является умной идеей.

Вот мой запрос:

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

В этом случае? будет установлен на:

нечеткий ({Бернхем}, 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, где monster in (?))

Спасибо!

1 Ответ

4 голосов
/ 11 октября 2011

Когда вы используете подготовленный оператор в 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 (?,?,?,?,?,?) ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...