根据当前日期+时间查询JPA实体的实例的最佳方法是什么?

时间:2014-02-18 14:50:28

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

我有一个实体类型,它有两个日期,startDate和endDate:

import org.joda.time.DateTime;

@Entity
public class Thing {
    @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
    private DateTime startDate;

    @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
    private DateTime endtDate;
}

我有一个Spring Data-JPA存储库(扩展CrudRepository)用于此实体类型,在那里我需要一种方法来查询“活动”的所有Thing,其中“active”定义为

startDate< = now< = endDate

我尝试了这样的JPQL查询,但它并没有在我们的一些测试中产生预期的结果:

@Query("select t from Thing t where t.startDate <= CURRENT_TIMESTAMP and t.endDate >= CURRENT_TIMESTAMP")
public Iterable<Thing> findAllActive();

我还尝试了一个方法名称约定查询,它确实产生了我期望的结果,但它很尴尬:

public Iterable<Thing> findByStartDateBeforeAndEndDateAfter(DateTime minStartDate, DateTime maxEndDate);

我可以将其包含在我的@Service

public Iterable<Thing> getActiveThings() {
    DateTime now = DateTime.now();
    return repository.findByStartDateBeforeAndEndDateAfter(now, now);
}

所以服务界面很干净,但是repo界面很丑陋(在我看来)。

有没有更好的方法来构建使用JPA的Repository查询方法,更好的基于方法名称的查询还是显式的JPQL查询?我宁愿不必在代码中手动构造Query对象(现在我甚至没有Repository的具体类,只有一个接口),但如果这是我考虑它的最佳方式。

2 个答案:

答案 0 :(得分:4)

您可以简单地拥有以下内容:

@Query("select t from Thing t where t.startDate <= :time and t.endDate >= :time")
public Iterable<Thing> findActiveThings(@Param("time") DateTime time);

它的优点是只使用1个参数,但也允许您以后查询如下:&#34;在2011年1月24日给我一些活动的东西&#34;

答案 1 :(得分:0)

您可以编写一个解决方法,如下所示:

@Query("SELECT t FROM Thing t WHERE t.startDate <= :maxStartDate AND :minEndDate <= t.endDate")
public Iterable<Thing> findAllActive();

并创建DateTime maxStartDateDateTime minEndDate,例如2015-01-01 00:00:002015-01-01 23:59:59

DateTime maxStartDate= new DateTime().withTime(23, 59, 59, 0);
DateTime minEndDate = new DateTime().withTimeAtStartOfDay();