1

我正在尝试运行以下查询并获得空指针异常。我已经验证了它WHERE lockedTimestamp <= (GETDATE() - CAST('00:06' AS datetime)是有效的 msSQL,因为我可以手动运行它并且它会正常工作。看起来 HQL(Hibernate Query Language)可能不喜欢它。关于如何调试这个有什么想法吗?

Query query = this.em.createQuery("SELECT c FROM Content c WHERE lockedTimestamp <= (GETDATE() - CAST('00:06' AS datetime))");
4

3 回答 3

1

EntityManager.createQuery期望JPQL中的查询字符串(不是 HQL,也不是 SQL)。JPQL 没有定义CAST函数。

我将计算 Java 中的时间戳限制,并将其作为参数传递给查询:

Date limit = ...;
this.em.createQuery("SELECT c FROM Content c WHERE lockedTimestamp <= ?")
       .setParameter(0, limit);
于 2012-05-21T16:18:44.863 回答
1

为什么不使用更明显和直观的计算,例如

SELECT c FROM Content c WHERE lockedTimestamp <= DATEADD(MINUTE, -6, GETDATE());

? 我认为这在 JPQL 中也无效,但更多的是一般查询本身,以防其他用户偶然发现这个问题......

顺便说一句,为什么不将此查询放在存储过程中呢?当然hibernate可以调用存储过程,那么它不需要尝试解释或反向工程您的查询。

于 2012-05-21T16:36:34.837 回答
1

调试sql,您可以通过在 hibernate 配置属性中添加配置hibernate.show_sql=true来显示启动 Hibernate 的查询。

查询将显示在控制台中,这是 hibernate 对数据库进行的确切查询。

于 2012-05-21T16:59:12.017 回答