如何在grails executeupdate中使用mysql时间函数

时间:2013-08-16 10:43:53

标签: mysql datetime grails domain-object

我正在尝试使用domain.executeUpdate从我的表中删除1个月的记录,如下所示

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语句中使用My SQL日期时间函数

请注意,此表包含大量数据,因此获取和删除单个记录将无法正常工作

3 个答案:

答案 0 :(得分: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])

答案 1 :(得分:1)

您可以尝试使用以下查询,只需要验证MySQL方言是否支持HQL函数:

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

答案 2 :(得分:1)

并非所有mysql函数都可用。您可以查看hibernate(和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"
    }
}