You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 00:45:38