2013-08-16 3 views
0

Я пытаюсь удалить 1 месяц старых записи из моей таблицы, используя domain.executeUpdate следующегоКак использовать MySQL функцию времени в Grails 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

Обратите внимание, что эта таблица имеет много данных, чтобы извлечь и удалить отдельные записи не будет работа

ответ

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]) 
+0

Спасибо за предложение, это работало идеально –

1

Вы можете попробовать, используя запрос, просто нужно проверить, поддерживаются ли функции 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)") 
1

Не все MySQL функции доступны. Вы можете посмотреть на 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" 
    } 
} 
+0

Похоже, 'current_date',' 'month' & year' доступны. Спасибо, что подтвердили. – dmahapatro

 Смежные вопросы

  • Нет связанных вопросов^_^