使用JPA / Hibernate Criteria在日期之间拉

时间:2010-11-23 13:39:43

标签: java hibernate jpa

我正在尝试使用以下代码从MySQL表中提取Experience对象列表。每个体验都有一个datetime列和一个datetime列,我只想拉出今天日期介于from和to之间的行。

我使用的是运行Hibernate的JPA 2.0。

    Date currentDate = new Date();
    CriteriaBuilder builder = entityManager.getCriteriaBuilder();
    CriteriaQuery<Experience> query = builder.createQuery(Experience.class);
    Root<Experience> root = query.from(Experience.class);
    builder.between(currentDate, root.get("from"), root.get("to"));
    return entityManager.createQuery(query).getResultList();

我的问题是builder.between()显然不允许我传递Date对象。

我的问题有更好的解决方案吗?

4 个答案:

答案 0 :(得分:19)

您可以将其作为参数传递:

ParameterExpression<Date> d = builder.parameter(Date.class);
builder.between(d, root.<Date>get("from"), root.<Date>get("to")); 
return entityManager.createQuery(query)
    .setParameter(d, currentDate, TemporalType.DATE).getResultList(); 

请注意,在这种情况下,您需要指定所需的时间类型。

此外,您可以依赖数据库的当前日期:builder.currentDate()builder.currentTimestamp()

答案 1 :(得分:10)

您只是错过了对CriteriaBuilder.literal()的调用:

Date currentDate = new Date();
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Experience> query = builder.createQuery(Experience.class);
Root<Experience> root = query.from(Experience.class);
builder.between(builder.literal(currentDate), root.get("from"), root.get("to"));
return entityManager.createQuery(query).getResultList();

答案 2 :(得分:6)

您应该切换参数:

builder.between(root.<Date>get("dateColumn"), startDate, endDate);

答案 3 :(得分:2)

此链接看起来很有希望:http://www.javalobby.org/articles/hibernatequery102/

您可以使用criteria.ge("date", root.get("from"));criteria.le("date"), root.get("to"));创建克劳斯之间的

如果那些不可用,那么您可能需要考虑编写HQL。