Привязка пустой переменной в PreparedStatement

Я клянусь, что это раньше работало, но это не в этом случае. Я пытаюсь соответствовать col1, col2 и col3, даже если один или несколько из них является пустым. Я знаю, что на некоторых языках должен был обратиться к многословиям как ((? is null AND col1 is null) OR col1 = ?). Это требуется здесь?

        PreparedStatement selStmt = getConn().prepareStatement(
                "SELECT     * " +
                "FROM       tbl1 " +
                "WHERE      col1 = ? AND col2 = ? and col3 = ?");
        try
        {
            int col = 1;
            setInt(selStmt, col++, col1);
            setInt(selStmt, col++, col2);
            setInt(selStmt, col++, col3);
            ResultSet rs = selStmt.executeQuery();
            try
            {
                while (rs.next())
                {
                   // process row
                }
            }
            finally
            {
                rs.close();
            }
        }
        finally
        {
            selStmt.close();
        }

   // Does the equivalient of stmt.setInt(col, i) but preserves nullness.
    protected  static void setInt(PreparedStatement stmt, int col, Integer i)
    throws SQLException
    {
        if (i == null)
            stmt.setNull(col, java.sql.Types.INTEGER);
        else
            stmt.setInt(col, i);
    }
12
задан Paul Tomblin 16 April 2010 в 01:14
поделиться

3 ответа

Это может зависеть от драйвера JDBC, но по большей части да, вам нужно будет использовать более расширенную форму, показанную выше.

Подготовленные операторы JDBC обычно являются относительно тонкими оболочками вокруг собственной реализации параметризованного запроса, то есть запроса с? вместо параметров передаются компилятору запросов и компилируются, поэтому позже, когда вы вызываете stmt.executeQuery (), оператор не может быть изменен из столбца =? в столбец IS NULL . Это не столько ограничение JDBC, сколько семантика NULL в SQL . Для SQL x = NULL не определено, как и x <> NULL .

Тем не менее, некоторые драйверы JDBC могут нарушить понятие NULL -ity в SQL и позволить setNull () преобразовать оператор из =? в IS NULL это было бы в высшей степени нестандартным поведением (хотя этого можно было бы легко добиться, написав какой-то метод предварительной обработки запроса).

9
ответ дан 2 December 2019 в 21:23
поделиться

Какую базу данных вы используете?

Но, по крайней мере, в Oracle равенство (и неравенство) никогда не соответствует NULL, вы должны написать IS NOT NULL.

3
ответ дан 2 December 2019 в 21:23
поделиться

Обычно что-то равное NULL всегда является ложным (даже NULL, поэтому SELECT * FROM tbl WHERE NULL = NULL; будет пустым набором), поэтому вам, вероятно, нужно проделать долгий путь если вы хотите принять такое нулевое равенство

1
ответ дан 2 December 2019 в 21:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: