Java вставить нулевую дату в mysql с запросом на обновление

Я работаю над Java-приложением (GUI, JDBC, MySQL), и у меня возникла проблема, которую я не могу решить.

Когда я вставляю данные в базу данных MySQL (есть этот тип данных String, INT, Date), нет проблем, если некоторые поля пусты. Эти пустые поля получают Null в БД. Но когда я хочу обновить какую-то строку, все поля даты должны быть заполнены, иначе это ошибка:

com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect date value: 'null' for column 'rociste_datum' at row 1

rociste_datum - первый столбец даты в БД

Есть части кода:

Код для метода вставки

    public void insertPredmetDB(String prezime, String ime, int nasBroj, Date datumRocista) {
        if (datumRocista == null || datumRocista.equals("")) {
            datumRocistaDB = null;
        } else {
            String datumRocistaSt = new SimpleDateFormat("yyyy-MM-dd").format(datumRocista);
            datumRocistaDB = java.sql.Date.valueOf(datumRocistaSt);
        }

Код для метода обновления

public void updatePredmetDB(int idNovo, String novoPrezime, String novoIme, int noviNasBroj, Date noviRocisteDatum) {
    if (noviRocisteDatum == null || noviRocisteDatum.equals("")) {
        noviRocisteDatumDB = null;
    } else {
        String datumRocistaSt = new SimpleDateFormat("yyyy-MM-dd").format(noviRocisteDatum);
        noviRocisteDatumDB = java.sql.Date.valueOf(datumRocistaSt);
    }
    String izmena = "UPDATE predmeti SET prezime='" + novoPrezime + "', ime='" + novoIme + "', nas_broj='" + noviNasBroj + "', rociste_datum='" + noviRocisteDatumDB + "'where id='" + idNovo + "'";

    try {

        PreparedStatement ps = con.prepareStatement(izmena);

        ps.execute();

    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Для всех этих дат существуют операторы if else, и эти объекты проходят через контроллер с одноэлементным шаблоном. Я думаю, что нет необходимости помещать этот код сюда, потому что нет ошибок, и все работает нормально, кроме этих дат.

Думаю, что проблема с преобразованием даты. Не могли бы вы мне помочь?

Не пытайтесь вставлять переменные в свой SQL. Вместо этого используйте параметры выписки. См. xkcd.com/327

khelwood 08.06.2018 15:08

Тем более, что вы уже используете PreparedStatement, подумайте об использовании его системы заполнителей ?. Как бы то ни было, вы пытаетесь обновить столбец даты значением 'null', которое, очевидно, не является допустимым строковым представлением даты.

Arnaud 08.06.2018 15:10

Кроме того, пропустите Date и SimpleDateFormat, эти классы давно устарели. Предполагая, что вы можете использовать Java 8 или новее и JDBC 4.2 или новее, используйте java.time.LocalDate и ps.setObject(4, yourLocalDate). Я ожидал, что это сработает, если yourLocalDate тоже будет null. Поскольку datumRocista.equals("") никогда не будет истинным, Date не может быть равен строке.

Ole V.V. 08.06.2018 23:54
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
869
1

Ответы 1

когда вы выполняете конкатенацию строк, например

rociste_datum='" + noviRocisteDatumDB + "'

тогда вы получите

rociste_datum='null'

вместо

rociste_datum=null

на этот раз никаких цитат. db ожидает дату или значение null, а не строку 'null'

Следовательно, используйте заполнители перед созданием подготовленного оператора, а затем установите параметры.

"UPDATE predmeti SET prezime=?, ime=?, nas_broj=?, rociste_datum=? where id=?";

Я обновил код, но это все та же ошибка com.mysql.jdbc.MysqlDataTruncation: усечение данных: неправильное значение даты: 'null' для столбца 'rociste_datum' в строке 1 String izmena = "UPDATE predmeti SET prezime = ?, ime = ?, nas_broj = ?, rociste_datum =? где id =? "; попробуйте {PreparedStatement ps = con.prepareStatement (измена); ps.setString (1, novoPrezime); ps.setString (2, новоИме); ps.setInt (3, noviNasBroj); ps.setDate (4, noviRocisteDatumDB); ps.setInt (5, idNovo); ps.execute ();

D.Mix 08.06.2018 18:40

Другие вопросы по теме