我有一个带有Oracle数据库的Spring Boot应用程序。这是我的存储库和实体:
public interface CampaignRepository extends CrudRepository<Campaign, Long> {
@Query("select k from Campaign k where k.validAfter <= :date")
List<Campaign> findAllValidAfterDate(@Param("date") LocalDate date);
}
实体:
@Entity
@OtherAnnotations
public class Campaign{
id and stuff...
private LocalDate validAfter;
}
现在我假设如果你将LocalDate.now()
放入函数中,它应该返回今天有效的所有广告系列。但是,如果我针对Oracle运行测试并不是这种情况,该测试包含今天有效的条目,其中时间在&#34; now&#34;之后。 validAfter
列的类型为DATE
。
在某种程度上,<=
比较中不会忽略时间部分。有人遇到过这种行为吗?如何确保忽略时间并仅在比较中使用日期?
我已经尝试过这个解决方案,但它没有效果: https://stackoverflow.com/a/40525940/1528880
谢谢!
答案 0 :(得分:0)
我会尝试使用LocalDate.now().atStartOfDay()
,它会在午夜00:00生成LocalDateTime
,这意味着今天的开始日期。所以只比较日期。
答案 1 :(得分:0)
没有一种直接的方法可以在JPA中持久化LocalDate,因为Java 8 LocalDate比JPA更年轻,而且在这种情况下JPA行为是不可预测的(实际上是,但我认为它是依赖于DB的行为)。您必须实现自己的AttributeConverter才能在实体中使用LocalDate。这是一个例子:
@Converter(autoApply = true)
public class LocalDateAttributeConverter implements AttributeConverter<LocalDate, Date> {
@Override
public Date convertToDatabaseColumn(LocalDate locDate) {
return (locDate == null ? null : Date.valueOf(locDate));
}
@Override
public LocalDate convertToEntityAttribute(Date sqlDate) {
return (sqlDate == null ? null : sqlDate.toLocalDate());
}
}
这是一篇很好的文章:https://www.thoughts-on-java.org/persist-localdate-localdatetime-jpa/