2013-05-15 2 views
1

У меня есть постоянный объект с двумя Date полями, как этотJPA сравнение метки времени не работает

@Temporal(TemporalType.TIMESTAMP) 
private Date generated; 

@Temporal(TemporalType.TIMESTAMP) 
private Date expirationTime; 

на объекте строительства в expirationTime инициализируется на основе generated поля

this.expirationTime = new Date(generated.getTime() + ttlMillis); 

Теперь я пытаясь удалить все истекшие объекты из базы данных по запросу JPA

Query q = em.createQuery("delete from MyObject t where CURRENT_TIMESTAMP > t.expirationTime"); 
q.executeUpdate(); 

Но работает простой тест

MyObject o = new MyObject(somePastDate, someTTL); 
em.persist(o); 
... create the query above 
q.executeUpate(); 

показывает ни одна строка не удаляется. Любая подсказка о том, что я делаю неправильно? Я запускаю тесты на HSQLDb и использую Hibernate в качестве моего поставщика JPA.

Редактировать: решил, но я не уверен, почему эта версия должна работать по-другому.

Query q = em.createQuery("delete from MyObject t where :now > t.expirationTime"); 
q.setParameter("now", new Date()); 
q.executeUpdate(); 

Что толку, если CURRENT_TIMESTAMP сравнения с другими полями не получится?

+2

Вы можете установить свойство гибернации - '' show_sql' в true', чтобы увидеть запрос, генерируемый спящий режим. –

+1

Вместо того, чтобы редактировать свой вопрос с ответом, вы должны опубликовать его как реальный ответ и принять его. Таким образом, вопрос будет отмечен как ответ, который он на самом деле. – Magnilex

ответ

0

Вы не устанавливали параметры, и запрос должен получить именованный параметр:

Query q = em.createQuery("delete from MyObject t where CURRENT_TIMESTAMP > :expirationTime"); 
q.setParameter("expirationTime" , yourObject.getExpirationTime());//or your getter 
q.executeUpdate(); 

добавить ссылку на соблюдение темы here.

Проверьте, работает ли он :-)

+0

Я не думаю, что мне нужен параметр, 'expirationTime' является членом постоянного объекта. Проверка ссылки. – agnul

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