【问题标题】:findByDate in spring boot jpa gives empty listspring boot jpa中的findByDate给出了空列表
【发布时间】:2020-12-14 10:07:37
【问题描述】:

我正在使用 Spring Boot JPA 进行 CRUD 操作。我正在使用日期类型的字段名称 created_at 查询数据库表。表中有一些行具有给定的日期,但 JPA 给出的结果集为零。我正在使用 Oracle 11g

这是我的实体

import java.sql.Date;
@Entity
@Table(name="veev_json")
public class VeevJson {
    
    @Id
    @Column(name="ID")
    private int id;
    
    @Column(name="CREATED_AT")
    private Date createdDate;
}

我的 JPA 存储库

import java.util.Date;
@Repository
public interface VeevJsonRepository extends JpaRepository<VeevJson, Integer> {
    public List<VeevJson> findByCreatedDate(Date date);
}

在服务层调用函数

Date date = new Date(); //taking current date of type java.util.Date
List<VeevJson> documents = veevJsonRepository.findByCreatedDate(date);

我的数据库表结构

ID  NUMBER(10,0)
CREATED_AT  DATE

hibernate生成的SQL查询:

select veevjson0_.ID as ID1_1_, veevjson0_.CREATED_AT as CREATED_AT2_1_, veevjson0_.JSON as JSON3_1_, veevjson0_.STATUS as STATUS4_1_ from veev_json veevjson0_ where veevjson0_.CREATED_AT=?

【问题讨论】:

    标签: java spring-boot hibernate jpa


    【解决方案1】:

    当使用日期类型的字段时,您还应该使用@Temporal 注释。 @Temporal 的默认值是 TemporalType.TIMESTAMP,您的 JPA 实现可能会对处理 java.util.Date 类型的字段感到困惑,将时间戳而不是日期作为查询参数传递。

    请将您的字段注释为

    import java.util.Date;
    
    @Entity
    @Table(name = "veev_json")
    public class VeevJson {
        @Id
        @Column(name = "ID")
        private int id;
    
        @Temporal(TemporalType.DATE)
        @Column(name = "CREATED_AT")
        public Date createdDate;
    
    ...
    }
    
    

    这样做将允许 JPA 实现仅将日期(可能采用“YYYY-MM-dd”格式)作为查询值发送,而不是时间戳或任何其他值。

    如果您愿意并且您的 JDBC 支持 4.1 版本,您可以将 java.util.Date 交换为 java8 时间 API 类型,但我想这超出了这里的范围。

    【讨论】:

      猜你喜欢
      • 2016-12-08
      • 2019-10-10
      • 2023-02-06
      • 2021-02-09
      • 2017-10-10
      • 2021-08-01
      • 2022-11-26
      • 2017-04-01
      • 2018-12-31
      相关资源
      最近更新 更多