我的实体中有两个日期。即
Date startDate;
Date endDate;
如何查询给定日期,它将返回指定日期介于startDate
和endDate
之间的所有实体?
我已经尝试了以下内容:
findByStartDateAfterAndEndDateBefore(Date givenDate);
而Spring-Data-JPA并不喜欢这样并且遇到错误。没有特定的错误,回购不能注入我的班级。
正确的方法是什么?我知道这可以通过Hibernate标准或使用Native SQL轻松完成,但尝试在Spring JPA中执行此操作。
这是查询本身的问题还是Spring使用的日期类型之间的某种不兼容性?
尝试findByStartDateAfterAndEndDateBefore(Date givenDate, Date givenDate)
然后返回null。
答案 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)
让我感到惊讶的是LessThan
和GreaterThan
工作,Before
和After
失败了。
我从未想过我可以使用少于和大于日期,并始终查看日期相关的功能,如之间,之前,之后。
这主要是因为文档示例
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);
你已经试过了吗?