Springboot data-jpa findByDate () - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь получить сегодняшние записи из базы данных mysql.

Я пытался использовать springboot data-jpa и метод findByDate (Date date, Pageable pageable) из jpa-репозитория, и он всегда возвращал пустые результаты.

Вот созданный код сущности:

@Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id_synop")
    private Long id;

    @Column(name="contenu")
    private String contenu;

    @Column(name="date", columnDefinition="TIMESTAMP(0)")
    @Temporal(TemporalType.TIMESTAMP)
    private Date date;

    @ManyToOne(cascade= {CascadeType.DETACH,CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH},
            fetch=FetchType.LAZY)
    @JoinColumn(name="id_station")
    @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
    private Station station;

и вот таблица Mysql, созданная с помощью Mysql WorkBench:

CREATE TABLE `synop` (
  `id_synop` bigint(20) NOT NULL AUTO_INCREMENT,
  `id_station` bigint(20) NOT NULL,
  `contenu` varchar(255) NOT NULL,
  `date` timestamp NOT NULL,
  PRIMARY KEY (`id_synop`),
  UNIQUE KEY `idmsgsynop_UNIQUE` (`id_synop`),
  KEY `fk_synope_station_idx` (`id_station`),
  CONSTRAINT `fk_synope_station` FOREIGN KEY (`id_station`) REFERENCES `station` (`id_station`)
) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8;

Код репозитория jpa:

import java.util.Date;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;

public interface SynopRepository extends JpaRepository<Synop, Long> {
    public Page<Synop> findByStationId(Long stationId, Pageable pageable);

    public Page<Synop> findByDate(Date date, Pageable pageable);
}

и код контроллера:

@GetMapping("/synops-today")
    public Page<Synop> findToday(@RequestParam(defaultValue="1") int page,Pageable pageable) {
        return synopRepository.findByDate(new Date(),PageRequest.of(page-1, 10, Sort.by("date").ascending()));
    }

Я ожидаю получить сегодняшние записи с помощью метода findByDate (...), но, похоже, он не работает. Я также заметил небольшую проблему при просмотре данных из MysqlWorkbench: даты кажутся на 2 часа раньше (например, сейчас 11:57, но в программном обеспечении mysql он показывает 9:57, когда я запрашиваю время сервера, он показывает, сколько времени ...) На самом деле меня не волнуют часы / минуты / секунды, я просто хочу получить сегодняшние записи.

Ответы [ 3 ]

0 голосов
/ 24 мая 2019

Я думаю, вы должны переключиться с java.util.Date на java.sql.Date во всех местах. Есть методы для преобразования между двумя.

Хотя я предпочитаю логику, чем делать findByDate. Между логикой будет точнее.

java.sql.Date JavaDoc,

Тонкая оболочка с точностью до миллисекунды, которая позволяет JDBC идентифицировать это как значение SQL DATE. Значение в миллисекундах представляет число миллисекунд, прошедших с 1 января 1970 года 00: 00: 00.000 ВРЕМЯ ПО ГРИНВИЧУ.

Чтобы соответствовать определению SQL DATE, значения в миллисекундах обернутый экземпляром java.sql.Date должен быть "нормализован" установкой часы, минуты, секунды и миллисекунды до нуля в определенный часовой пояс, с которым связан экземпляр.

java.util.Date JavaDoc - этот JavaDoc является длинным, но соответствующим разделом,

Класс Date представляет определенный момент времени с точностью до миллисекунды. точность.

0 голосов
/ 25 мая 2019

Я нашел рабочее решение для моей проблемы, по-видимому, при использовании типа данных TIMESTAMP метод JPA-Data "findByDate ()" не работает "из коробки". На самом деле мне нужно было найти записи, сравнивая только часть даты с отметкой времени, поэтому я использовал аннотацию запроса так:

@Query("from Synop s where DATE(s.date) = :date")
public Page<Synop> findByDate(@Param("date") Date date, Pageable pageable);

здесь помогла функция sql DATE (), так как она учитывает только часть даты временной метки при сравнении ее с датой, которую я указала для поиска. При этом я мог искать данные, сравнивая даты, сохраняя при этом тип отметки времени (для отображения часов, минут, секунд ..) Спасибо за помощь.

0 голосов
/ 24 мая 2019

Попробуйте, поможет ли вам это решение -> сравнение только по дате без использования времени jpa-named-query

Обычно попробуйте использовать @Temporal(TemporalType.DATE) вместо @Temporal(TemporalType.TIMESTAMP)

Если нет, то вы можете написать собственный запрос, который использует функцию sql для сопоставления только части даты, а не времени -> сравнение-дат-в-mysql-ignoring-time-part

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