Java Springboot数据jpa findByDate()
我试图从mysql数据库中检索今天的记录 我尝试使用springboot数据jpa和jpa存储库中的findByDate(Date-Date,Pageable-Pageable)方法,它总是返回空结果 以下是创建的实体代码: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")
@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”函数。你可以用它来记录时间细节。