Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / jdbcTemplate.queryForObject / 8 сообщений из 8, страница 1 из 1
21.06.2021, 09:32
    #40079070
jdbcTemplate.queryForObject
Есть метод, который должен вставить в таблицу error_log запись в случае ошибки при обновлении.

Как в этом случае правильно отловить ошибку в soldCarServiceDTO, чтобы soldCarServiceDTO.getPurchase_datetime()!=null

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
    public void updateState(JdbcTemplate jdbcTemplate) {
        SoldCarServiceDTO soldCarServiceDTO = null;
        String query = "UPDATE sold_car_service SET service_state = ? WHERE  purchase_datetime >= ? AND purchase_datetime < ?";
        try {
            soldCarServiceDTO = jdbcTemplate.queryForObject(query, new BeanPropertyRowMapper<>(SoldCarServiceDTO.class), getState().toString(), getFrom(), getTo());
        } catch (Exception e) {
            jdbcTemplate.update("INSERT INTO error_log VALUES(?, ?)", soldCarServiceDTO.getPurchase_datetime(), e.getMessage());
        }
    }



Чтобы записать параметр я использую RowMapper
Код: java
1.
new BeanPropertyRowMapper<>(SoldCarServiceDTO.class)



Впринципе вместо
Код: java
1.
jdbcTemplate.queryForObject



можно использовать простую конструкцию
Код: java
1.
jdbcTemplate.update(query, getState().toString(), getFrom(), getTo());

но здесь без RowMapper не отловить ошибку
...
Рейтинг: 0 / 0
21.06.2021, 09:52
    #40079075
jdbcTemplate.queryForObject
т.е в случае возникновения ошибки необходимо в таблицу error_log сделать запись с конкретной ошибочной датой в пределах purchase_datetime.

Например soldCarServiceDTO.getPurchase_datetime()='2020-02-05' для этой записи не произошло обновления

Возможно ли вообще в таком sql запросе перехватить конкретную дату?
...
Рейтинг: 0 / 0
21.06.2021, 10:01
    #40079076
lleming
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jdbcTemplate.queryForObject
Как то так

update ... where getPurchase_datetime()='2020-02-05' and update_files != $update_value
...
Рейтинг: 0 / 0
21.06.2021, 10:44
    #40079089
jdbcTemplate.queryForObject
lleming,

soldCarServiceDTO.getPurchase_datetime()='2020-02-05' - это пример, конкретики нет где возможно может свалиться
...
Рейтинг: 0 / 0
21.06.2021, 12:58
    #40079123
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jdbcTemplate.queryForObject
А есть steps по воспроизведению ошибки? Просто мне кажется что мы ловим то чего нет.

И запись в лог делают в автономной транзакции. Тут точно есть фиксация?
...
Рейтинг: 0 / 0
21.06.2021, 13:00
    #40079124
Alexander A. Sak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jdbcTemplate.queryForObject
Почему-то мне кажется, в приведенном коде всегда будем попадать в catch, потому что запрос не возвращает набор данных.
...
Рейтинг: 0 / 0
21.06.2021, 13:26
    #40079133
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jdbcTemplate.queryForObject
В любом случае ему надо (по доке) проверить результат на null
и ловить не Exception а IncorrectResultSizeDataAccessException,
и DataAccessException.

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/jdbc/core/JdbcTemplate.html

Ну и update... это странно. Что он возвращает? Обычно число обновлённых data-rows. Или это какая-то экзотическая
dbms что может вернуть нечто более ценное?
...
Рейтинг: 0 / 0
21.06.2021, 23:02
    #40079241
jdbcTemplate.queryForObject
mayton,

Разобрался. Можно получить через batchUpdate, передав параметры. Как раз возвращает массив



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
            String updateQuery="UPDATE sold_car_service SET service_state = '" + getState().toString() + "' WHERE id = ? ";

            List<SoldCarServiceDTO> purchases = jdbcTemplate.query("SELECT id " +
                            " FROM sold_car_service WHERE service_state != ? " +
                            " AND service_state != 'CLOSED' " +
                            "AND purchase_datetime >= ? " +
                            "AND purchase_datetime < ? ",
                    new Object[] {getState().toString(), getFrom(), getTo()},
                    new int[] { Types.VARCHAR, Types.DATE, Types.DATE },
                    new BeanPropertyRowMapper<>(SoldCarServiceDTO.class));

            List<Object[]> updateParams = new ArrayList<>();
            purchases.forEach(dto -> updateParams.add(new Object[]{dto.getId()}));

int[] result = jdbcTemplate.batchUpdate(updateQuery, updateParams, new int[] { Types.INTEGER });

   SoldCarServiceDTO notUpdatedDTO = null;
            for (int i = 0; i < result.length; i++) {
                if (result[i] == 0) {
                    notUpdatedDTO = purchases.get(i);
                    errorParams.add(new Object[] {now, "Not updated, id = " + notUpdatedDTO.getId()});
                }
            }



И уже массив result проверять на наличие ошибок проходясь по нему.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / jdbcTemplate.queryForObject / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]