#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 '*'
.