2013-08-16 61 views
0

我想利用我的domain.executeUpdate表中刪除1個月的記錄如下如何使用MySQL的時間函數中的Grails的executeUpdate

Bugrerun.executeUpdate("delete Bugrerun b where b.complete = 1 and b.date 
< date_sub(curdate(), INTERVAL 1 MONTH) ") 

我試圖使用查詢裏面一個MySQL日期函數。

但這種失敗,出現錯誤

org.hibernate.hql.ast.QuerySyntaxException: unexpected token: 1 near line 1 
, column 97 

我們如何使用executeUpdate的語句中的我的SQL日期時間函數

注意,此表中有大量數據,以便讀取和刪除個人記錄將不工作

回答

1

您可以實現自己的數據庫方言以包含該功能。

另一種選擇是要做到這一點:

Calendar cal = Calendar.getInstance(); 
cal.setTime(new Date()); 
cal.add(Calendar.MONTH, -1); 

Bugrerun.executeUpdate("delete Bugrerun b where b.complete = 1 and b.date 
< :oneMonthAgo", [oneMonthAgo: cal.time]) 
+0

感謝您的建議,這個工作完美 –

1

你可以用下面的查詢嘗試,只需要驗證HQL功能是否在MySQL方言支持:

Bugrerun.executeUpdate("delete Bugrerun b \ 
         where b.complete = 1 \ 
         and month(current_date()) > month(b.date) \ 
         or year(current_date()) > year(b.date)") 
1

並非所有的MySQL功能可用。你可以看看所使用的休眠(和Grails)MySQLDialect看你有沒有可用的功能爲您提供: http://grepcode.com/file/repository.springsource.com/org.hibernate/com.springsource.org.hibernate/3.3.1/org/hibernate/dialect/MySQLDialect.java#MySQLDialect

如果你願意,你可以嘗試使用Groovy SQL執行SQL語句,而不是一個HQL語句。如果你這樣做,在你的控制器或服務,你應該讓你得到的DataSource注入宣佈一個DataSource屬性:

class MyController { 
    DataSource dataSource 

    def execSql(){ 
      def sql = new Sql(dataSource) 
      sql.execute("delete from bugrerun where complete = 1 and date < date_sub(curdate(), INTERVAL 1 MONTH) ") 
      render "done" 
    } 
} 
+0

看起來像'current_date','month'&'year'可用。感謝您的確認。 – dmahapatro

相關問題