2010-11-23 67 views
10

我想要使用下面的代码从MySQL表中拉取经验对象的列表。每个经验都有一个从datetime列和一个到datetime列,并且我只想在当前日期落在from和to之间的行上。使用JPA/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对象。

有没有更好的解决我的问题?

回答

19

你可以把它作为一个参数。

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

+1

谢谢 - 这是完美的。我现在的问题是,由于某种原因,root.get(“from”)返回一个Path对象而不是一个Expression对象? – christophmccann 2010-11-23 13:59:58

2

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

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

如果这些都没有,那么你可能需要考虑写HQL。在这种情况下,你需要指定期望时间型

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(); 

注:

+1

格式化位,现在看起来好点 – 2010-11-23 13:46:29

6

您应该切换你的论点:

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

你只是缺少调用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();