我有一个实体类型,它有两个日期,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的具体类,只有一个接口),但如果这是我考虑它的最佳方式。
答案 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 maxStartDate
和DateTime minEndDate
,例如2015-01-01 00:00:00
和2015-01-01 23:59:59
DateTime maxStartDate= new DateTime().withTime(23, 59, 59, 0);
DateTime minEndDate = new DateTime().withTimeAtStartOfDay();