JPA - 返回在开始日期之后和结束日期之前的实体

2022-09-01 23:06:56

我的实体中有两个日期。即。

Date startDate;
Date endDate;

如何查询,以便在给定日期的情况下,它将返回指定日期位于 和 之间的所有实体。startDateendDate

我已经尝试了以下方法:

findByStartDateAfterAndEndDateBefore(Date givenDate);

Spring-Data-JPA不喜欢这样,并遇到了错误。没有特定的错误,存储库无法注入到我的类中。

正确的方法是什么?我知道这可以很容易地完成,使用Hibernate标准或使用Native SQL,但尝试在Spring JPA中做到这一点。

这是查询本身的问题,还是Spring使用的日期类型之间存在某种不兼容性?

已尝试,但返回 null。findByStartDateAfterAndEndDateBefore(Date givenDate, Date givenDate)


答案 1

由于Spring Data的限制,您不能只使用一个参数,但您可以使用如下代码来解决它:

List<AnEntity> findByStartDateBeforeAndEndDateAfter(Date startDate, Date endDate);

default List<AnEntity> findByStartDateBeforeAndEndDateAfter(Date givenDate) {
    return findByStartDateBeforeAndEndDateAfter(givenDate, givenDate);
}

此代码应满足您的需求。我还用Spring Boot 1.5.9验证了它。使用 spring-data-get-started 示例


答案 2

令我惊讶的是,工作和失败严重。LessThanGreaterThanBeforeAfter

我从没想过我可以对日期使用小于和大于,并且总是查看日期相关的函数,例如介于,之前,之后。

这主要是因为文档示例

After

findByStartDateAfter

… where x.startDate > ?1

Before

findByStartDateBefore

… where x.startDate < ?1

因此,我更仔细地查看了Spring Data JPA的文档,并通过以下示例发现了一些有趣的东西。

 LocalDate date = new LocalDate().minusYears(2);
 return builder.lessThan(root.get(_Customer.createdAt), date);

因此,在比较数据时间时,作者使用时间属性的标准。lessthan

所以给了一个镜头与小于和工作,并再次给了一个镜头与大于以及后来一起。所以我得出了一个结论

public MyDateEntity findByStartDateLessThanAndEndDateGreaterThan(Date sDate, Date eDate); 

到目前为止,这是有效的。我相信,一定有一种干净的方式来处理约会,但我就是想不通。before,after,between

如果有人弄清楚了,那就太好了。