oracle - 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通过断言日期公平是真的原因是什么?
解决方案
LocalDate
不包含时间组件,但您在数据库中使用的数据类型包含并且它不适0
用于数据库中的数据。
为了进行比较(发生在数据库中),LocalDate
将转换为日期+时间,其中时间可能是0
,这不等于数据库中存在的日期+时间。
当实体被加载时,数据库值的时间部分被删除,结果等于您的LocalDate
值。
推荐阅读
- amazon-web-services - AWS EC2,我需要更多 RAM,而不必为我的 EC2 实例提供更好的实例系列
- reactjs - 在 react-native 中使用数组列表中的数据
- sql - SQL DATEPART(qq, @date) 日期季度开始十月
- python - 使用 Beautiful Soup 在特定标签中获取字符串
- sql - 从 a=1 和 a=2 的表中选择
- java - 为什么在不同的类中使用相同的“For循环”在Java中给了我不同的输出?
- python - 使用更少的代码行访问特定目录中的数据
- php - 生成除php中指定数字外的随机数
- html - 如何获取清除输入字段的 CSS 选择器?
- spring-boot - Kafka Streams以编程方式配置不起作用