首页 > 解决方案 > Spring JPA Equal条件与LocalDate的派生查询不起作用

问题描述

我有一个类型为DATE我的 Entiy 类的 Oracle DB,其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失败并出现空错误,这意味着即使test2通过了date等于 id:1 实体的开始日期,相等条件也无法给出该实体的存在

ps:我已将合同表的 ID:1 合同开始日期值设置为2021,03,9,如图所示 在此处输入图像描述

那么为什么test1无法获得平等的实体以及为什么test2通过断言日期公平是真的原因是什么?

标签: oraclespring-bootspring-data-jpa

解决方案


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

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

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


推荐阅读