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 自定义查询,分页,排序,条件查询