[英]Springboot data-jpa findByDate()
我正在尝试从mysql数据库中检索Today的记录。
我尝试使用springboot data-jpa和jpa-repository中的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);
}
和控制器代码:
@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 workbench软件中它显示为9:57,当我查询服务器时间时它显示了不正确的时间虽然...)我实际上并不关心我想要检索今天记录的小时/分钟/秒。
尝试此解决方案可以帮助您 - > date-only-comparison-without-time-using-jpa-named-query
基本上,尝试使用@Temporal(TemporalType.DATE)
而不是@Temporal(TemporalType.TIMESTAMP)
如果没有那么你可以编写自定义查询,它使用sql函数来匹配日期部分而不是时间 - > 比较日期在mysql-ignoring-time-portion
我想,您应该在所有地方从java.util.Date
切换到java.sql.Date
。 有两种方法可以转换。
虽然我更喜欢逻辑而不是findByDate。 逻辑之间会更准确。
java.sql.Date
JavaDoc,
一个围绕毫秒值的瘦包装器,允许JDBC将其标识为SQL DATE值。 毫秒值表示自1970年1月1日00:00:00.000 GMT以来经过的毫秒数。
为了符合SQL DATE的定义,java.sql.Date实例包含的毫秒值必须通过在与实例关联的特定时区中将小时,分钟,秒和毫秒设置为零来“标准化”。 。
java.util.Date
JavaDoc - 这个JavaDoc很长但相关部分,
Date类表示特定的时刻,精度为毫秒。
我为我的问题找到了一个有效的解决方案,显然当使用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()函数,它在这里有所帮助,因为在将它与我为搜索提供的日期进行比较时,它只考虑时间戳的日期部分。 有了这个,我可以搜索比较日期的数据,同时保持时间戳类型(显示小时,分钟,秒......)感谢您的帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.