Spring Data LocalDate比较失败(时间不被忽略)

时间:2018-02-19 14:20:08

标签: oracle hibernate spring-boot spring-data jpql

我有一个带有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

谢谢!

2 个答案:

答案 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/