Вот полезный метод для этого конкретного случая, когда в вашем WHERE
есть несколько пунктов, но вы заранее не знаете, какие из них вам нужно применить.
Будет ли ваш пользователь искать по названию?
select id, title, author from book where title = :title
Или по автору?
select id, title, author from book where author = :author
Или и то и другое?
select id, title, author from book where title = :title and author = :author
Достаточно плохо столько 2 поля.Количество комбинаций (и, следовательно, различных PreparedStatements) увеличивается экспоненциально с количеством условий.Правда, скорее всего, у вас достаточно места в вашем пуле PreparedStatement для всех этих комбинаций, и для программного построения предложений в Java вам просто необходима одна ветвь if
для каждого условия.Тем не менее, это не так красиво.
Вы можете исправить это аккуратно, просто составив SELECT
, который выглядит одинаково, независимо от того, требуется ли каждое отдельное условие.
Мне вряд ли стоит упоминать, что вы используете PreparedStatement
, как подсказывают другие ответы, и NamedParameterJdbcTemplate хорошо, если вы используете Spring.
Вот оно:
select id, title, author
from book
where coalesce(:title, title) = title
and coalesce(:author, author) = author
Затем вы предоставляете NULL
для каждого неиспользованного условия.coalesce()
- это функция, которая возвращает свой первый ненулевой аргумент.Таким образом, если вы передадите NULL
для :title
, первым предложением будет where coalesce(NULL, title) = title
, что оценивается как where title = title
, что, будучи всегда истинным, не влияет на результаты.
В зависимости от того, как оптимизатор обрабатываеттакие запросы, вы можете получить удар по производительности.Но, вероятно, не в современной базе данных.
(Хотя, похоже, эта проблема , а не такая же, как проблема предложения IN (?, ?, ?)
, когда вы не знаете количество значений в списке, поскольку здесь у вас do есть фиксированное количество возможных предложений, и вам просто нужно активировать / деактивировать их по отдельности.)