jdbctemplate — Список запросов — передача даты?

#java #spring #jdbc

#java #весна #jdbc

Вопрос:

Я пишу небольшое приложение spring, которое имеет функциональность jdbc в контексте следующего кода…

У меня есть следующая java для настройки строки запроса SQL :

     String sql =
            "SELECT "  
                    "    a.Id, "  
                    "    a.USER_ID ", "  
                    "    a.LAST_UPDATED "  
                    "from "  
                    "    Schema.AwesomeTable a "  
                    "where "  
                    "    a.LAST_UPDATED >= ?";
  

и я пытаюсь использовать объект date (давайте просто представим, что я использую текущую дату, чтобы этот вопрос оставался кратким) :

 Date myDate = new Date(); // This is a java.util.Date
  

и я вызываю запрос следующим образом :

 List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql, new Object[]{myDate});
  

Когда я запускаю это — я получаю эту ошибку :

 2019-04-08 23:17:58 - Setting SQL statement parameter value: column index 1, parameter value [Tue Apr 08 23:17:58 CDT 2019], value class [java.util.Date], SQL type unknown
  

Мне действительно не помешала бы помощь — я везде искал Google, и я нашел НЕКОТОРУЮ информацию, но я не видел ничего, что я, кажется, мог бы понять.

Комментарии:

1. Попробуйте обернуть это в java.sql.Date.

Ответ №1:

Вы могли бы обернуть свой параметр java.sql.Date или использовать:

 import java.util.Date;
import java.time.LocalDate;

LocalDate dateTime = // some date here
Date startDate = Date.from(dateTime.atStartOfDay(ZoneId.systemDefault()).toInstant());
  

Комментарии:

1. Спасибо, но когда я это делаю, он на самом деле просто вылетает и выдает недопустимый тип столбца, к сожалению:(

Ответ №2:

Вы не можете напрямую использовать myDate переменную типа java.util.Date в своем sql-запросе

 Date myDate = new Date(); // This is a java.util.Date
  

вы должны преобразовать его в java.sql.Date тип, который вы можете сделать следующим образом:

 java.sql.Date sqlDate = new java.sql.Date(myDate.getTime());
  

после чего вы можете вызвать запрос следующим образом:

 List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql,sqlDate);
  

который будет работать, как ожидалось.

Комментарии:

1. Видите, я на 100% думал, что это может сработать именно так, но когда я это делаю, я все равно получаю ту же ошибку — за исключением того, что тип изменен следующим образом: Установка значения параметра SQL statement: индекс столбца 1, значение параметра [2019-04-09], класс значений [java.sql.Date], SQLтип неизвестен Тип столбца «Дата», и это oracle db

2. oracle по умолчанию принимает дату в следующем формате: вставить в таблицу (date_column) значения (’31-oct-02′);

3. вы можете использовать функцию to_date от Oracle: insert into table (date_column) values (to_date('023110', 'YYDDMM')); лучше преобразовать дату в формат *** oracles по умолчанию ***, чем использовать to_date

Ответ №3:

** LocalDate может быть передан как строка непосредственно в инструкции prepard **

 jdbcTemplate.query(selectSqlQuery,
                    ps -> {
                        ps.setString(1, searchDate.toString());
                    }, new RowMapperForOutput());
  

Запрос:

выберите * из таблицы1, где date(date_column)= ?;