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

时间:2017-12-20 06:42:08

标签: java spring date spring-data-jpa jpql

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

Date startDate;
Date endDate;

如何查询给定日期,它将返回指定日期介于startDateendDate之间的所有实体?

我已经尝试了以下内容:

findByStartDateAfterAndEndDateBefore(Date givenDate);

而Spring-Data-JPA并不喜欢这样并且遇到错误。没有特定的错误,回购不能注入我的班级。

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

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

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

6 个答案:

答案 0 :(得分:10)

由于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 example

答案 1 :(得分:5)

让我感到惊讶的是LessThanGreaterThan工作,BeforeAfter失败了。

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

这主要是因为文档示例

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相关的日期,但我无法解决这个问题。

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

答案 2 :(得分:2)

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

的内容

答案 3 :(得分:2)

由于你只需要Date对象作为LocalDate的等价物,这应该可以解决问题。

default List<AnEntity> findByStartDateAfterAndEndDateBefore(Date startDate, Date endDate) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(endDate);
    cal.add(Calendar.DATE, -1);
    return findByStartDateBetween(startDate, cal.getTime());
}

因为您希望它包含开头而不是结尾,并且SQL BETWEEN是包含的,所以我们只会在一天后移动结束。

答案 4 :(得分:2)

    Public List<EntityClass> findData(Date startDate,Date endDate)
   {
     Query<EntityClass> _q = em.createQuery("select a.* from _tableName a 
                         where a.startDate>= :d1 AND a.endDate<= :d2");
    _q.setParameter("d1", startDate, TemporalType.DATE);
    _q.setParameter("d2", endDate, TemporalType.DATE);
    List<EntityClass> result = query.getResultList();
    em.getTransaction().commit();
    return result;
   }

答案 5 :(得分:0)

我使用它没有这样的问题:

findAllByEntityNotNullAndDateBetween(Date begin, Date end);

你已经试过了吗?