Запрос с неверным результатом JPA Spring Boot - PullRequest
1 голос
/ 29 апреля 2020

У меня проблема, и @Query в базе данных не дает мне правильных результатов.

В WorkBench с этим запросом: SELECT * FROM Table WHERE FECHA_INICIO >= '2020-02-01' AND FECHA_FIN <= '2020-02-28' возвращает всего 18 результатов.

Но с моим JAVA кодом отображаются только 6 записей, и они являются теми, которые в столбце FECHA_INICIO имеют 2020-02-01, а в столбце FECHA_FIN они имеют значение 2020-02-28. Записи, которые в любом из этих столбцов имеют дату, которая не соответствует последнему дню месяца или первому, не показывают их. Вот в чем проблема.

Это мой JAVA код из хранилища:

public interface TableRepository extends CrudRepository<Table, String> {

    @Query(value = "SELECT * FROM Table WHERE FECHA_INICIO >= :fechaInicio AND FECHA_FIN <= :fechaFin", nativeQuery = true)
    List<Table> findAllBetweenDates(@Param("fechaInicio") Date fechaInicio, @Param("fechaFin") Date fechaFin);
}

Я пытался посмотреть, какой запрос выполнял код, но в журналах он показывал только следующее :

org.hibernate.SQL.logStatement - SELECT * FROM TABLE WHERE FECHA_INICIO >= ? AND FECHA_FIN <= ?

Оба столбца в базе данных имеют тип Дата. Добавьте этот код, если он работает для меня, в копию базы данных, которая у меня есть в PostgreSQL, но в MySQL, где он показывает мне только 6 записей вместо 18. Любая идея, что может происходить ?

РЕДАКТИРОВАТЬ:

Это мой класс сущности:

@Entity
@Table(name = "Table")
public class Table{

    @Id
    @Column(name = "ID", length = 20)
    @NotNull
    private String id;

    @Column(name = "FECHA_INICIO")
    @Temporal(TemporalType.DATE)
    @NotNull
    private Date fechaInicio;

    @Column(name = "FECHA_FIN")
    @Temporal(TemporalType.DATE)
    @NotNull
    private Date fechaFin;

    @Column(name = "DESCRIPTION", length = 20)
    @NotNull
    private String descripcion;
}

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Вполне вероятно, что вы сравниваете дату и время, и некоторые строки фильтруются.

Пример:

2020-04-23 15: 00

2020-04-23 01: 00

Вы можете использовать следующую функцию для форматирования даты (startDate и endDate) перед выполнением запроса

private Date getFormattedFromDateTime(Date date) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    return cal.getTime();
}

И, как сказал @Ritika: пожалуйста, попробуйте использовать java .time. * это намного лучше, чем java .util. *

0 голосов
/ 29 апреля 2020

Из того, что я понял до сих пор, вы используете java.util.date в своей сущности и хранилище. Убедитесь, что вы указали в полях даты в вашей сущности @Temporal(TemporalType.Date).

Кроме того, я предполагаю, что ваша java версия 8 или выше. Если это так, стоит попробовать java.time.LocalDate. :)

Надеюсь, это поможет!

РЕДАКТИРОВАТЬ: Я попытался с локальной настройкой сегодня. Хотя я не смог воспроизвести вашу конкретную проблему c, но у меня есть несколько наблюдений, когда я запускаю код в режиме отладки -

  1. URL-адрес соединения для MySQL нуждается в информации о часовом поясе serverTimezone=UTC. Когда я не предоставлял эту информацию, она выдала мне исключения во время запуска сервера.

  2. С java.util.Date в контроллере запрос анализируется с часовым поясом. Таким образом, для показанного ниже контроллера, если я использую startDate = 2019-01-01, он переведен на 1 января 2019 05: 30IST, т. Е. У него была информация о моем местном часовом поясе.

    @GettMapping(value = "/test") public List<Test> getResult( @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate startDate, @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate endDate) { List<Test> result = testService.getResult(startDate, endDate); return result; }

Исходя из вышеприведенных наблюдений, я чувствую, что проблема может быть вызвана выбранным часовым поясом.

После этого я изменил java.util.Date на java.time.LocalDate в Controller, Service, Entity и Repository. Также я удалил @Temporal(TemporalType.Date) из своей сущности. На этот раз в отладке была выбрана только дата.

** Можете ли вы попробовать использовать java.time.LocalDate в своем коде и поделиться результатами. Кроме того, внесите изменения в вашу сущность, как я уже упоминал в разделе комментариев! **

PS - Это может не решить вашу проблему полностью, но определенно поможет в дальнейшей отладке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...