Spring JPA Equal条件与LocalDate的派生查询不起作用

Posted

技术标签:

【中文标题】Spring JPA Equal条件与LocalDate的派生查询不起作用【英文标题】:Spring JPA Equal conditon with derived query for LocalDate not working 【发布时间】:2021-06-28 02:49:18 【问题描述】:

我有一个类型为 DATE 的 Oracle 数据库,我的 Entiy 类有 LocalDate 参数,如下所示

@Entity
@Table(name = "CONTRACT")
public class ContractEntity 
    private Long id;
    private LocalDate contractStartDate;
    private LocalDate contractEndDate;
    ...

对于测试,我创建了派生查询以通过contractStartDate 查找实体

public interface ContractRepository extends JpaRepository<ContractEntity, Long>, JpaSpecificationExecutor<ContractEntity> 
            ContractEntity getContractEntityByContractStartDateIs(LocalDate date)

然后我创建了两个测试如下;

 @DisplayName("Should get Exact Date  Entity")
    @Test
    void test1()
        LocalDate date=LocalDate.of(2021,03,9);
        ContractEntity entity= searchService.getByDate(date); // getByDate is mapped to getContractEntityByContractStartDateIs() in service layer
        assertEquals(date,entity.getContractStartDate());
    



    @DisplayName("Should match ID:1 Entity's Date with Local Date")
    @Test
    void test2()
        ContractEntity entity=searchService.getById(1l).get(); 
        assertEquals(1l,entity.getId());
        LocalDate date=LocalDate.of(2021,03,9);
        assertEquals(date,entity.getContractStartDate());
    


我的问题是 test1 失败并出现 null 错误,这意味着即使 test2 通过了 date 等于 id:1,也无法给出该实体的存在实体的开始日期

p.s:我已将 Contract Table 的 ID:1 Contract Start Date 值设置为 2021,03,9,如下图所示

那么为什么 test1 未能获得平等的实体以及为什么 test2 通过断言日期公平是真的

【问题讨论】:

【参考方案1】:

LocalDate 不包含时间组件,但您在数据库中使用的数据类型包含,并且数据库中的数据不是0

为了进行比较(发生在数据库中)LocalDate 被转换为日期+时间,其中时间可能是0,这不等于数据库中存在的日期+时间。

当实体被加载时,数据库值的时间部分被删除,结果等于您的 LocalDate 值。

【讨论】:

谢谢你,这就是我将时间改为 00:00:00 的原因

以上是关于Spring JPA Equal条件与LocalDate的派生查询不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data 系列学习Spring Data JPA 自定义查询,分页,排序,条件查询

Spring Data 系列学习Spring Data JPA 自定义查询,分页,排序,条件查询

JPA/Criteria API - Like & equal 问题

Spring Data JPA中带条件的分页查询

spring jpa : 多条件查询

spring jpa 条件查询统计