1

我正在尝试使用 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 日期时间函数

请注意,此表有大量数据,因此无法获取和删除单个记录

4

3 回答 3

2

您可以尝试以下查询,只需验证 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)")
于 2013-08-16T14:26:25.063 回答
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])
于 2013-08-16T13:44:00.257 回答
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"
    }
}
于 2013-08-16T15:40:05.993 回答