2010-11-23 68 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();