Как использовать функции времени 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"
    }
}
Другие вопросы по тегам