Чтобы протестировать реализацию репозитория JPA, я использую скрипт с оператором вставки. Среди других атрибутов данных он также вставляет значение для столбца метки времени.
create table t_travel(
travel_id int unsigned not null,
bus_id int unsigned not null,
source varchar(75) not null,
destination varchar(75) not null,
departure_datetime timestamp not null
);
alter table t_travel add constraint pk1_travel primary key (travel_id);
insert into t_travel(bus_id, source, destination, departure_datetime, status)
values(1, 'XXX', 'YYY', '2020-04-05 00:00:00', 'Open';
Один из методов в этом репозитории JPA использует метод проекции DTO и JPA для извлечения данных, удовлетворяющих определенному условию.
@Query("select new gro.edu.ot.dto.TravelSearchResultDto(" +
"t.travelId, t.source, t.destination, t.departureDatetime, t.status " +
") from Travel t " +
"where t.source = :source and t.destination = :destination " +
"and departureDatetime = :fromDt")
public List<TravelSearchResultDto> getTravel(String source, String destination,
LocalDateTime fromDt);
Наконец, мой тест выглядит следующим образом. Это продолжало терпеть неудачу (assertTrue), поскольку никакая строка не была выбрана.
@Test
public void testTravelSearch(){
List<TravelSearchResultDto> result =
travelRepository.getTravel("XXX","YYY",LocalDateTime.of(2020,4,5,0,0));
result.forEach(t -> logger.info("{}", t));
assertTrue(result.size() > 0);
}
Наконец, когда я изменил последний предикат в моем JPQL, где условие больше или равно, как показано ниже, тест начал успешно выполняться
and departureDatetime >= :fromDt
Удивлен, я обновил toString () из DTO. Похоже, что у dateDatetime другое время
TravelSearchResultDto{travelId=1, source='XXX', destination='YYY',
departureDatetime=2020-04-05T10:00}
Я использую mysql: 8.0.19, Spring boot org.springframework.boot: 2.2.5.RELEASE
Есть кто-нибудь сталкивался с подобной проблемой или можно объяснить наблюдение?