我正在尝试从mysql数据库中检索今天的记录。
我尝试使用jpa-repository中的springboot data-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);
}
和控制器代码:
@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的数据时,我还注意到了一个小问题:日期似乎提前了2h(例如:现在是11:57,但是在mysql工作台软件中,它显示9:57,当我查询服务器时间时,它显示了irght tme ...) 我实际上并不在乎我只想检索今天的记录的小时/分钟/秒。
答案 0 :(得分:0)
尝试该解决方案是否对您有帮助-> date-only-comparison-without-time-using-jpa-named-query
基本上,尝试使用@Temporal(TemporalType.DATE)
代替@Temporal(TemporalType.TIMESTAMP)
否则,您可以编写使用sql函数仅匹配日期部分而不匹配时间的自定义查询-> comparing-dates-in-mysql-ignoring-time-portion
答案 1 :(得分:0)
我认为,您应该在所有位置从java.util.Date
切换到java.sql.Date
。
有两种方法可以在两者之间进行转换。
尽管我更喜欢逻辑之间而不是findByDate。逻辑之间将更加准确。
java.sql.Date
JavaDoc,
围绕毫秒值的精简包装器,它使JDBC能够识别 这是一个SQL DATE值。毫秒值代表数字 自1970年1月1日00:00:00.000以来经过的毫秒数 格林威治标准时间。
要符合SQL DATE的定义,毫秒值 必须通过设置将“ java.sql.Date”实例包装的实例“标准化” 在小时,分钟,秒和毫秒中将零 实例所关联的特定时区。
java.util.Date
JavaDoc-这个JavaDoc很长,但是相关,
Date类表示特定时间点,以毫秒为单位 精度。
答案 2 :(得分:0)
我找到了解决我问题的可行方法,显然,在使用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()函数,在这里提供了帮助,因为与我为搜索提供的日期进行比较时,它仅考虑了时间戳的日期部分。 有了这个,我可以搜索比较日期的数据,同时保留时间戳类型(以显示小时,分钟,秒..) 感谢您的帮助。