我正在尝试运行以下查询并获取空指针异常。我已经验证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))");
答案 0 :(得分:1)
EntityManager.createQuery
需要JPQL中的查询字符串(不是HQL,而不是SQL)。 JPQL没有定义CAST
函数。
我在Java中计算时间戳限制,并将其作为参数传递给查询:
Date limit = ...;
this.em.createQuery("SELECT c FROM Content c WHERE lockedTimestamp <= ?")
.setParameter(0, limit);
答案 1 :(得分:1)
为什么不使用更加明显和直观的计算,例如
SELECT c FROM Content c WHERE lockedTimestamp <= DATEADD(MINUTE, -6, GETDATE());
?我认为这在JPQL中也是无效的,但对于一般查询本身更多,以防其他用户偶然发现这个问题......
顺便说一句,为什么不将此查询放在存储过程中?当然,hibernate可以调用存储过程,然后它不需要尝试解释或反向设计查询。
答案 2 :(得分:1)
要调试 sql,您可以通过在hibernate配置属性中添加配置 hibernate.show_sql = true 来显示启动Hibernate的查询。
查询将显示在控制台中,它是hibernate对数据库的确切查询。