如何使用JPA CriteriaBuilder指定时间类型?

时间:2011-08-03 14:34:45

标签: java jpa

我的表有一个类型为dateTime的列(我正在使用SQL Server)。我想通过dateTime列查询表。我想要在dateTime列中具有相同日期或更晚的行,但我想将日期作为参数。简而言之,dateTime必须大于或等于指定日期。

我遇到的问题是,当我尝试使用条件API查询Date对象时,它只会在第二天提供行。我怀疑它试图找到具有相同毫秒或更晚的行。在JPA查询语言中,我可以指定参数的Temporal类型(setParameter(“dateColumn”,myDate,Temporal.DATE)),但我在CriteriaBuilder API中找不到任何类似的东西。有什么建议吗?

我的代码目前看起来像这样:

cb.greaterThanOrEqualTo(r.<Date>get(fieldName), beginDate));

3 个答案:

答案 0 :(得分:1)

由于我没有得到答案,我将假设现在除了在您的应用程序中以编程方式之外还有其他方法。

如果我想对星期一星期后创建的实体进行查询,我必须创建一个Date对象,将日期设置为星期一,并清除Date对象的小时,分​​钟,秒和毫秒。 Apache Commons Lang库有一个帮助类,就这种情况称为DateUtils。它有方法truncate,可用于从Date对象中获取不必要的准确性,因此您可以在CriteriaBuilder中使用greatedThanOrEqual。

答案 1 :(得分:1)

您可以使用ParameterExpression:

ParameterExpression<Calendar> beginDateParameter = cb.parameter(Calendar.class);
...
...
criteriaQuery.select(...)
  .where(criteriaBuilder.equal(r.get(fieldName), beginDateParameter));

entityManager.createQuery(criteriaQuery)
     .setParameter(beginDateParameter, beginDate, TemporalType.DATE)
     .getResultList(); 

Hibernate日志显示日期作为DateTime传递:

TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [0] as [DATE]

答案 2 :(得分:0)

好吧,如果我使用DataNucleus JPA运行以下类

@Entity
public class A
{
    @Id
    Long id;

    @Temporal(TemporalType.DATE)
    Date date;
}

这将日期存储在DATE列中。然后运行以下查询

SELECT a FROM A a WHERE a.date >= :myDate"

传入一个java.util.Date作为参数(包括小时/分钟/秒),它会创建一个

的查询
SELECT 'org.datanucleus.test.A' AS NUCLEUS_TYPE,A."DATE",A.ID,A."NAME" FROM A A WHERE A."DATE" >= <2009-06-15>

其中&lt; 2009-06-15&gt;是JDBC的一个参数(尖括号仅显示为表示这一点),我没有遇到任何问题,即它正确地将参数解释为匹配它所比较的​​类型(这是JPA规范所暗示的应该发生的)< / p>

显然,如果Hibernate有问题,你可以传入一个java.sql.Date,并在Hibernate上引发一个bug