Spring Boot使用Hibernate存储yyyy-MM-dd格式日期的问题
解决Hibernate存储Java Date时仅保留日期(不带时间)的问题
方案1:改用Java 8+的LocalDate类型(推荐)
旧的java.util.Date本身包含时间戳信息,改用专门的日期类型java.time.LocalDate是最彻底的解决方式——它天然只存储年月日,无需额外处理时间部分。
在实体类中修改字段类型,并配合JPA注解:
import java.time.LocalDate; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; @Entity public class Reservation { @Id private Long id; // 直接用LocalDate类型,指定数据库列类型为DATE @Column(name = "date", columnDefinition = "DATE") private LocalDate date; // 其他字段、getter/setter省略 }
存入数据库时只会保留yyyy-MM-dd格式的日期,查询时直接匹配LocalDate对象即可,不会出现时间偏差问题。
方案2:为java.util.Date字段添加注解约束
如果必须保留java.util.Date类型,通过Hibernate的注解强制只存储日期部分:
import java.util.Date; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Entity public class Reservation { @Id private Long id; // 标注为DATE类型,同时指定数据库列类型 @Temporal(TemporalType.DATE) @Column(name = "date", columnDefinition = "DATE") private Date date; // 其他字段、getter/setter省略 }
@Temporal(TemporalType.DATE)会告诉Hibernate只处理Date对象中的日期部分、忽略时间;columnDefinition = "DATE"确保数据库列的类型是日期型(而非datetime)。
方案3:查询时兼容已有带时间的数据(临时解决方案)
如果数据库中已经存在带时间的旧数据,且暂时无法修改存储逻辑,可以调整查询条件,匹配当天的所有时间范围:
JPQL方式
// 在Repository接口中定义查询方法 @Query("SELECT r FROM Reservation r WHERE r.date BETWEEN :startOfDay AND :endOfDay") List<Reservation> findByDate(@Param("startOfDay") Date startOfDay, @Param("endOfDay") Date endOfDay);
调用时生成目标日期的起始(00:00:00)和结束(23:59:59)时间:
// 假设目标日期是2022-11-09 Calendar cal = Calendar.getInstance(); cal.set(2022, Calendar.NOVEMBER, 9, 0, 0, 0); Date start = cal.getTime(); cal.set(2022, Calendar.NOVEMBER, 9, 23, 59, 59); Date end = cal.getTime(); List<Reservation> reservations = reservationRepository.findByDate(start, end);
原生SQL方式
SELECT * FROM reservations WHERE DATE(date) = '2022-11-09';
对应JPARepository的写法:
@Query(value = "SELECT * FROM reservations WHERE DATE(date) = :targetDate", nativeQuery = true) List<Reservation> findByDate(@Param("targetDate") String targetDate);
内容的提问来源于stack exchange,提问作者Elias
相关产品推荐
相关产品推荐

