Рассмотрим этот простой метод:
public ResultSet getByOwnerId(final Connection connection, final Integer id) throws SQLException {
PreparedStatement statement = connection.prepareStatement("SELECT * FROM MyTable WHERE MyColumn = ?");
statement.setObject(1, id);
return statement.executeQuery();
}
Предполагается, что пример метода должен выбирать все из некоторой таблицы, где совпадает значение столбца, что должно быть простым.Ужасная деталь в том, что передача NULL для идентификатора приведет к пустому ResultSet, независимо от того, сколько строк в БД, потому что SQL определяет NULL как не euqaling anyting, даже NULL.Единственный способ выбрать те строки, о которых я знаю, - это использовать другое предложение where:
SELECT * FROM MyTable WHERE MyColumn IS NULL
К сожалению, единственный способ заставить метод работать должным образом во всех случаях, кажется, иметь две совершенно разные схемы выполнения,один для случая, когда аргумент id равен нулю, а другой для обычных значений.
Это очень уродливо, и когда у вас есть более одного столбца, который можно обнулять, он может очень быстро запутаться.Как можно обрабатывать NULL и нормальные значения с одним и тем же путем / оператором кода?