Могу ли я получить строку из prepareStatem.setString ()? - PullRequest
0 голосов
/ 11 января 2012

У меня проблема - я создаю свои SQL-запросы динамически и основываясь на пользовательских параметрах ввода. Таким образом, у пользователя есть 5 параметров (на самом деле это больше), и он может выбрать некоторые из них (все, если он хочет) или ни одного и указать их значение в запросе. Поэтому я строю свой запрос String (основные условия WHERE), проверяя, был ли выбран параметр и было ли предоставлено значение. Однако сейчас существует проблема специальных символов, таких как '. Я мог бы попытаться использовать replaceAll ("'", "\\"), но это довольно скучно, и я знаю, что prepareStatement.setString () делает работу лучше. Однако для меня мне нужно было бы проверить еще раз, был ли предоставлен параметр и был ли предыдущий также (указать яд? И подключить его к нужному параметру). Это вызывает много комбинаций и не выглядит элегантно.

Так что мой вопрос - могу ли я как-нибудь получить строку readyStatement.setString (), которая производит? Или есть аналогичная функция, которая выполняла бы ту же работу и давала бы мне строку, чтобы я мог вставить ее в запрос вручную.

Возможно, вступление было слишком длинным, но у кого-то может быть идея получше, и я хотел объяснить, зачем мне это нужно.

Ответы [ 2 ]

0 голосов
/ 11 января 2012

На другом форуме мне предложили другой, более простой и понятный подход, который отлично работает.Вот некоторые ссылки для других с такой же проблемой: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1669972300346534908 http://www.akadia.com/services/dyn_modify_where_clause.html

0 голосов
/ 11 января 2012

Что вы можете сделать, это построить базовый непараметрический запрос SQL на основе того, были ли заданы параметры, а затем использовать подготовленный оператор для заполнения параметров.

Это может выглядеть примерно так (грубый набросок):

Map<String, Object> parameterValues = /*from user*/;
List<String> parameterNames = Arrays.asList("field1", "field2", "field3");
List<Object> valueList = new ArrayList<Object>();

StringBuilder statementBuilder = new StringBuilder("select * from table where ");
for ( String parameterName : parameterNames ) {
    if ( parameterValues.containsKey(parameterName) ) {
        statementBuilder.append(parameterName + " = ? AND");
        valueList.add(parameterValues.get(parameterName));
    }
}

PreparedStatement st = conn.prepareStatement(statementBuilder.toString(), 
                       valueList);
//set each parameter here.

Это трудно только в первый раз; тогда вы можете сделать его общим. Тем не менее, есть, вероятно, разработчики запросов, которые абстрагируют все это для вас. Я использую QueryDSL, но у него нет привязок для чистого JDBC, а скорее JPA, JDO и т. Д.

...