я довольно долго не использую Spring, и я сталкиваюсь с некоторыми трудностями с этим средством отображения строк JdbcTemplate, отображающим поле даты.
Я пытаюсь подробно объяснить свою ситуацию.
В моей базе данных (MariaDB) эта таблица называется TREND002 :
+-----------------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+----------+------+-----+---------+-------+
| Time_Stamp | datetime | NO | PRI | NULL | |
| Time_Stamp_ms | int(11) | NO | PRI | NULL | |
| Sensor001DV | double | YES | | NULL | |
| Sensor002DV | double | YES | | NULL | |
| Sensor003DV | double | YES | | NULL | |
..............................................................
..............................................................
..............................................................
| Sensor00NDV | double | YES | | NULL | |
NOTE-1: Time_Stamp содержит значение as 2010-10-22 16: 50: 12
Тогда у меня есть этот класс DTO, отображающий поле предыдущей таблицы:
public class TrendDTO {
private Date dateTime;
private int timeStampMs;
private String sensorValue;
public TrendDTO() {
super();
}
public TrendDTO(Date dateTime, int timeStampMs, String sensorValue) {
super();
this.dateTime = dateTime;
this.timeStampMs = timeStampMs;
this.sensorValue = sensorValue;
}
public Date getDateTime() {
return dateTime;
}
public void setDateTime(Date dateTime) {
this.dateTime = dateTime;
}
public int getTimeStampMs() {
return timeStampMs;
}
public void setTimeStampMs(int timeStampMs) {
this.timeStampMs = timeStampMs;
}
public String getSensorValue() {
return sensorValue;
}
public void setSensorValue(String sensorValue) {
this.sensorValue = sensorValue;
}
@Override
public String toString() {
return "TrendDTO [dateTime=" + dateTime + ", timeStampMs=" + timeStampMs + ", sensorValue=" + sensorValue + "]";
}
}
В основном в этом DTO у меня есть класс:
- A Дата , отображающая поле datetime поля моей таблицы.
- An int поле, отображающее поле Time_Stamp_ms моей таблицы.
- A String поле, отображающее значение указанного c SensorXXXDV поля таблицы (я знаю, что из с точки зрения реляционной базы данных это ужасно ужасно ... но я унаследовал проект и в настоящий момент не могу измениться.)
Финн У меня есть класс репозиторий , в котором есть этот метод:
@Override
public List<TrendDTO> findTrendListBySensorName(String tableName, String columnName) {
List<TrendDTO> result = null;
String RETRIEVE_TREND_BY_SENSOR_NAME = "SELECT Time_Stamp, Time_Stamp_ms, Sensor240DV FROM Delphys.TREND003";
//result = jdbcTemplate.query(RETRIEVE_TREND_BY_SENSOR_NAME, BeanPropertyRowMapper.newInstance(TrendDTO.class));
result = jdbcTemplate.query(
RETRIEVE_TREND_BY_SENSOR_NAME,
(rs, rowNum) ->
new TrendDTO(
new java.util.Date(rs.getTimestamp("Time_Stamp").getTime()),
rs.getInt("Time_Stamp_ms"),
String.valueOf(rs.getDouble(columnName))
)
);
return result;
}
Он работает нормально, но при этом я получаю список TrendDTO экземпляров, содержащих dateTime значения полей, подобные этому:
dateTime = пт 22 октября 16:50:12 PDT 2010
Дата совершенно правильная, но я думаю, что это неправильный формат. Я должен вернуть этот объект DTO в формате JSON во внешний интерфейс, и мне нужна дата в формате:
2010-10-22 16: 50: 12
Я также пытался изменить свой код сопоставления, используя это:
result = jdbcTemplate.query(
RETRIEVE_TREND_BY_SENSOR_NAME,
(rs, rowNum) ->
new TrendDTO(
//new java.util.Date(rs.getTimestamp("Time_Stamp").getTime()),
rs.getTimestamp("Time_Stamp"),
rs.getInt("Time_Stamp_ms"),
String.valueOf(rs.getDouble(columnName))
)
);
Как вы можете видеть, я просто использую rs.getTimestamp ("Time_Stamp") , но делаю так Я получаю dateTime инициализацию, как это: 2010-10-22 16: 50: 12.0
Как вы можете видеть, это заканчивается .0 это должно представлять миллисекунды, которые я не хочу. Могу ли я указать формат, чтобы избежать добавления этого конечного миллисекундного раздела?
Другой возможный подход для решения моей проблемы (возможно, лучшее решение) заключается в следующем: в этой довольно ужасной таблице базы данных информация о миллисекундах содержится в Time_Stamp_ms столбец, который на данный момент сопоставлен с моим полем timeStampMs DTO.
Могу ли я изменить свой предыдущий код, чтобы инкапсулировать эту информацию непосредственно в поле dateTime моего объекта DTO?
Я абсолютно не уверен, что с этим синтаксисом (так ли это лямбда-выражение?) это возможно. Могу ли я сделать это, используя этот синтаксис, или я должен реализовать класс отображения строк для реализации этого поведения?