2012-05-21 58 views
1

我試圖運行以下查詢並獲取空指針異常。我已經驗證WHERE lockedTimestamp <= (GETDATE() - CAST('00:06' AS datetime)是有效的msSQL,因爲我可以手動運行它,它會正常工作。看起來HQL(Hibernate查詢語言)可能不喜歡它。任何想法,我怎麼可以去調試呢?如何查看HQL最終查詢

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

回答

1

爲什麼不使用更明顯直觀的計算,例如

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

?我收集這是不是在JPQL有效,但更多的一般查詢本身的情況下,其他用戶偶然發現這個問題...

另外,爲什麼不把這個查詢存儲在存儲過程?當然,hibernate可以調用存儲過程,然後它不需要嘗試解釋或逆向工程查詢。

+0

+1爲更容易準備查詢....我怎麼會用createQuery()雖然^ _^ – Webnet

+0

@Webnet不知道,對不起 - 我知道SQL,但我不使用休眠。 –

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

調試 SQL,你也可以說通過增加配置hibernate.show_sql =真在Hibernate配置屬性將啓動休眠查詢。

查詢將顯示在控制檯中,它是hibernate對數據庫的確切查詢。