Подготовленный оператор с нулевыми параметрами

#java #sql #prepared-statement

#java #sql #подготовленный оператор

Вопрос:

Я работаю над небольшой программой для базы данных, которая упрощает запросы выбора.

Программа использует графический интерфейс, в котором вы можете ввести параметры поиска. Если вы не введете все параметры, они будут завершены по результатам запроса. Итак, я попытался проверить, является ли параметр из текстового поля пустым / нулевым, и установил для заполнителя значение «*».

Но когда я попытался запустить. Даже с запрограммированными заполнителями он выдает синтаксическую ошибку SQLException.

Я опубликую сокращенную версию всего кода, которая технически такая же.

 PreparedStatement Statement = connection.prepareStatement("select * From t_person where user_a = ? "  "AND where dasatz_a = ? "   "AND where user_g = ? ");

if (Parameter.get(0) == null) {
    Parameter.set(0, "*") };

Statement.setString(1, Parameter.get(0));
  

и так далее.

Параметр — это список массивов с параметрами из текстовых полей.

Комментарии:

1. Statement.setString(1, Parameter.get(0));—>зачем использовать parameter.get(0) agian, он вернет только null, поэтому исключение синтаксиса sql!

2. И что такое «Синтаксическая ошибка»? Можем ли мы это увидеть? В вашем фрагменте кода нет проблем, вы что-то скрываете. (Я мог видеть только, что в запросе есть три заполнителя, но в фрагменте вы задаете только первый).

3. @shekharsuman: если параметр имеет значение null, устанавливается значение. Если его значение не равно null, я установил, что значение уже задано.

4. @kan: в исходном коде есть 9 заполнителей. Я пишу только одно из предложений if, потому что остальные не меняются.

Ответ №1:

Просто не фильтруйте столбец каким-либо образом, если для столбца «filtered» не указан параметр. Динамически подготовьте ваш запрос, чтобы включить только те параметры, которые указаны.

 Map<Integer, String> statementParams = new HashMap<>();
String query = "select * From t_person";
boolean firstCondition = true;

if (Parameter.get(0) != null) {
    if (firstCondition) {
        query  = " where ";
        firstCondition = false;
    } else {
        query  = " and ";
    }
    query  = "user_a = ?";
    statementParams.put(1, Parameter.get(0));
}
// other params
PreparedStatement Statement = connection.prepareStatement(query);

for (MapEntry<Integer, String> entry : statementParams.entrySet()) {
    Statement.setString(entry.getKey(), entry.getValue());
}
  

Ответ №2:

Как указал @juergen d, ваш оператор sql недействителен, поскольку в нем содержится несколько предложений where:

выберите * из t_person, где user_a = ? » «И где dasatz_a = ? » «И где user_g = ?

должно быть:

выберите * из t_person, где user_a = ? И dasatz_a = ? И user_g = ?

Кроме того, ваше использование '*' приведет к значениям, где user_a буквально * . Если вы хотите сделать его поиском по шаблону, синтаксис должен измениться на LIKE (вместо equals) и использовать '%' вместо than '*' .

http://www.w3schools.com/sql/sql_wildcards.asp