JPA - 返回StartDate之后和EndDate之前的实体

Sur*_*tta 19 java spring date jpql spring-data-jpa

我的实体有两个约会.即.

Date startDate;
Date endDate;
Run Code Online (Sandbox Code Playgroud)

我如何查询以便给定日期,它将返回指定日期位于startDate和之间的所有实体 endDate

我已经尝试过以下方法:

findByStartDateAfterAndEndDateBefore(Date givenDate);
Run Code Online (Sandbox Code Playgroud)

Spring-Data-JPA不喜欢这样并且遇到错误.没有特定的错误,repo就不能注入我的班级.

什么是正确的方法?我知道这可以通过Hibernate标准或使用Native SQL轻松完成,但尝试在Spring JPA中执行此操作.

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

尝试findByStartDateAfterAndEndDateBefore(Date givenDate, Date givenDate)然后返回null.

Sas*_*ota 12

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

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

default List<AnEntity> findByStartDateBeforeAndEndDateAfter(Date givenDate) {
    return findByStartDateBeforeAndEndDateAfter(givenDate, givenDate);
}
Run Code Online (Sandbox Code Playgroud)

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

  • 正如我在答案中提到的,这是工作代码,它遵循文档,我在实例上验证了它.尝试复制粘贴它,可能是你在检查时弄错了. (2认同)

Sur*_*tta 5

令我惊讶LessThanGreaterThan工作,Before并且After失败严重.

我从没想过我可以使用少于和大于日期,并始终查看日期相关的功能,如之间,之前,之后.

这主要是因为文档示例

After

findByStartDateAfter

… where x.startDate > ?1

Before

findByStartDateBefore

… where x.startDate < ?1
Run Code Online (Sandbox Code Playgroud)

所以我更接近Spring Data JPA的文档,并通过下面的例子找到了一些有趣的东西

 LocalDate date = new LocalDate().minusYears(2);
 return builder.lessThan(root.get(_Customer.createdAt), date);
Run Code Online (Sandbox Code Playgroud)

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

所以给了一个低于和工作的镜头,并再次给予一个大于以及后来一起的镜头.所以我想出了一个结论

public MyDateEntity findByStartDateLessThanAndEndDateGreaterThan(Date sDate, Date eDate); 
Run Code Online (Sandbox Code Playgroud)

到目前为止这是有效的.而且我相信,必须有一个干净的方式来处理日期,before,after,between但我无法弄明白.

如果有人明白这一点会很棒.


Hir*_*ren 3

AND您在 JPA 查询中使用条件,但仅提供一个参数。你应该使用像findByStartDateAfterAndEndDateBefore(Date startDate, Date endDate);