Готовая выписка с условием where в случае любого значения - PullRequest
0 голосов
/ 08 апреля 2020

Я подготовил заявление, подобное

select * from books where author = ? and theme = ?

, и я не могу понять, что делать, если пользователь выбрал опцию «любой автор» или «любая тема», что я должен установить для подготовленного оператора?

Ответы [ 3 ]

2 голосов
/ 08 апреля 2020

Это случай для «Dynami c SQL». Вы можете сделать это вручную или использовать ORM.

Давайте рассмотрим ручной пример:

String sql;
if (author == null) {
  if (theme == null) {
     sql = "select * from books";
  } else {
     sql = "select * from books where theme = ?";
  }
} else {
  if (theme == null) {
     sql = "select * from books where author = ?";
  } else {
     sql = "select * from books where author = ? and theme = ?";
  }
}
PreparedStatement ps = con.createStatement(sql);
int param = 1;
if (author != null) {
  ps.setString(param++, author);
}
if (theme != null) {
  ps.setString(param++, theme);
}
// The rest is just running the SQL and read the ResultSet.

Теперь, если у вас есть 10 параметров, ORM действительно очень помогает. Практически все они поддерживают динамические c SQL действительно хорошим способом.

1 голос
/ 08 апреля 2020

Какие части заявления SQL должны присутствовать, не охватывается подготовленными утверждениями (если вы не проявите творческий подход). Обычно решение генерирует условия в предложении where динамически, например:

String sql = "select * from books where 1=1";
if (author != null) { 
    sql += " and author=?";
}
if (theme != null) { 
    sql += " and theme=?";
}

После того, как вы подготовили оператор, вам нужно установить параметры, следя за использованием правильных индексов:

int parameterIndex = 1;
if (author != null) {
    preparedStatement.setString(parameterIndex, author);
    parameterIndex++;
}
if (theme != null) {
    preparedStatement.setString(parameterIndex, theme);
    parameterIndex++;
}
0 голосов
/ 08 апреля 2020

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

...