Как использовать функции времени mysql внутри grails executeupdate
Я пытаюсь удалить записи за 1 месяц из моей таблицы, используя domain.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
Как мы можем использовать функции даты и времени My SQL внутри операторов executeUpdate
Обратите внимание, что в этой таблице много данных, поэтому выборка и удаление отдельных записей не будут работать
3 ответа
Вы можете реализовать свой собственный диалект базы данных, чтобы включить эту функцию.
Другой вариант - сделать это:
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])
Вы можете попробовать выполнить запрос ниже, просто нужно проверить, поддерживаются ли функции 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)")
Не все функции mysql доступны. Вы можете взглянуть на MySQLDialect, который используется hibernate (и grails), чтобы увидеть доступные вам функции: 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"
}
}