我正在尝试使用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日期时间函数
请注意,此表包含大量数据,因此获取和删除单个记录将无法正常工作
答案 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"
}
}