Java Springboot数据jpa findByDate()

Java Springboot数据jpa findByDate(),java,hibernate,spring-boot,spring-data-jpa,Java,Hibernate,Spring Boot,Spring Data Jpa,我试图从mysql数据库中检索今天的记录 我尝试使用springboot数据jpa和jpa存储库中的findByDate(Date-Date,Pageable-Pageable)方法,它总是返回空结果 以下是创建的实体代码: @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="id_synop") private Long id; @Column(name="contenu")

我试图从mysql数据库中检索今天的记录

我尝试使用springboot数据jpa和jpa存储库中的findByDate(Date-Date,Pageable-Pageable)方法,它总是返回空结果

以下是创建的实体代码:

@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 WorkBench创建的Mysql表:

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);
}
import java.util.Date;
导入org.springframework.data.domain.Page;
导入org.springframework.data.domain.Pageable;
导入org.springframework.data.jpa.repository.JpaRepository;
公共接口SynopRepository扩展了JpaRepository{
公共页面findByStationId(长站点ID,可分页);
公共页面findByDate(日期,可分页);
}
以及控制器代码:

@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()));
    }
@GetMapping(“/synops today”)
公共页面findToday(@RequestParam(defaultValue=“1”)int页,可分页{
返回synopRepository.findByDate(new Date(),PageRequest.of(page-1,10,Sort.by(“Date”).ascending());
}
我希望使用findByDate(…)方法获得今天的记录,但它似乎不起作用。我还注意到从MysqlWorkbench查看数据时出现了一个小问题:日期似乎提前了2小时(例如:现在是11:57,但在MysqlWorkbench软件中显示的是9:57,当我查询服务器时间时,显示的是irght tme…)
实际上,我不在乎小时/分钟/秒,我只想检索今天的记录。

如果此解决方案对您有帮助,请尝试->

基本上,尝试使用
@Temporal(TemporalType.DATE)
而不是
@Temporal(TemporalType.TIMESTAMP)


如果没有,那么您可以编写自定义查询,使用sql函数只匹配日期部分而不匹配时间->

我认为,您应该在所有位置从
java.util.date
切换到
java.sql.date
。 有一些方法可以在这两者之间进行转换

虽然我更喜欢在逻辑之间而不是在findByDate中。逻辑之间的关系将更加准确

java.sql.Date
JavaDoc

一个围绕毫秒值的薄包装器,允许JDBC识别 这是一个SQL日期值。毫秒值表示该数字 自1970年1月1日00:00:00.000以来经过的毫秒数 格林尼治标准时间

为了符合SQL日期的定义,毫秒值 由java.sql.Date实例包装的数据必须通过设置 中到零的小时、分钟、秒和毫秒 实例关联的特定时区

java.util.Date
JavaDoc-这个JavaDoc很长,但是相关的部分

类日期表示特定的时间瞬间,以毫秒为单位 精确性


我为我的问题找到了一个有效的解决方案,显然,当使用时间戳数据类型时,JPA数据“findByDate()”方法无法开箱即用。实际上,我需要通过比较时间戳的日期部分来查找记录,所以我使用了如下查询注释:

@Query("from Synop s where DATE(s.date) = :date")
public Page<Synop> findByDate(@Param("date") Date date, Pageable pageable);
@Query(“从Synop s where DATE(s.DATE)=:DATE”)
公共页面findByDate(@Param(“date”)date-date,Pageable-Pageable);
sql DATE()函数在这里很有帮助,因为在将时间戳的日期部分与我为搜索提供的日期进行比较时,它只考虑时间戳的日期部分。 有了它,我可以在保持时间戳类型的同时搜索比较日期的数据(显示小时、分钟、秒..)
谢谢您的帮助。

您正在使用mysql dialact吗
spring.jpa.properties.hibernate.dialent=org.hibernate.dialent.mysql5dialent
尝试将cntrlr中的日期从java.util.date更改为sql.date…尝试#findByDateBetween(日期开始,日期结束,可分页),开始是今天的日期加上00:00,结束是今天的日期加上24:00:00。“日期似乎提前了2小时”,可能是时区问题。您的解决方案可行,但我需要时间戳数据类型,以便显示创建的时间。如果我把它改为DATE,我所有的记录都会有00:00:00小时。我给出的第二个解决方案是使用“DATE”函数。你可以用它来记录时间细节。