2013-09-27 5 views
0

Возможно, это простой вопрос, но он должен работать уже на мой взгляд. Я хочу установить статус на каждом Аукционе, где expdate меньше текущей даты. expDate - это DATETIME в базе данных. На самом деле это не работает. Не могли бы вы помочь? Я также попытался с CURRENT_TIMESTAMPjpa datetime сравнить eclipselink

Query query = entityManager.createQuery("UPDATE Auction e SET e.status = 0 WHERE e.expDate < :today"); 
     query.setParameter("today", new Date(), TemporalType.TIMESTAMP); 

редактировать:

Query query = entityManager.createQuery("UPDATE Auction e SET e.status = 0 WHERE e.status = 1"); 

что не работает тоже. Я использую: @PersistenceContext() EntityManager entityManager; Кажется, что запрос обновления не выполняется.

+1

Вы вызывали query.executeUpdate() ;? createQuery предоставляет только объект запроса, который вы можете использовать для добавления подсказок и т. д. перед выполнением. – Chris

+0

Я не могу использовать executeUpdate в non-transactional entityManager, полученный из PersistantContext –

+0

да, для этого требуется транзакция. Если вы не используете JTA, оберните изменения в em.getTransaction(). Begin(); em.getTransaction() фиксации(). вызовы, в противном случае вам нужно будет обернуть свой метод в транзакцию или просмотреть его из контейнера, чтобы запустить его. – Chris

ответ

0

Я сделал уродливое обходное решение. Я получил все аукционы, затем я получил все истекшие аукционы для цикла и, наконец, объединил истекшие авторизации. Последнее дело - снова делать аукционы, чтобы вернуть их. Мне пришлось использовать транзакцию, несмотря на использование JTA. Но это должно было быть UserTransation, которое мне непонятно. Кто-нибудь может объяснить мне почему?

@Resource 
    UserTransaction ut; 

    public List<Auction> getAuctionList() throws Exception { 
     Query query = entityManager.createQuery("SELECT e FROM Auction e WHERE e.status=1"); 
     query.setHint("javax.persistence.cache.storeMode", "REFRESH"); 
     auctionList = (List<Auction>) query.getResultList(); 
     for (Auction a : auctionList) { 
      Date today = new Date(); 
      System.out.println("compare: " + a.getExpDate() + " and " + today); 
      if (a.getExpDate().compareTo(new Date()) < 0) { 
       a.setStatus("0"); 
       ut.begin(); 
       entityManager.merge(a); 
       ut.commit(); 
      } 
     } 
     Query newQuery = entityManager.createQuery("SELECT e FROM Auction e WHERE e.status=1"); 
     newQuery.setHint("javax.persistence.cache.storeMode", "REFRESH"); 
     auctionList = (List<Auction>) newQuery.getResultList(); 
     return auctionList; 
    } 
+0

У вас есть контейнер, вводящий транзакцию - он подпадает под транзакцию из части контейнера моего предыдущего комментария. JTA - это набор api, а UserTransaction - один из включенных интерфейсов. Таким образом, вы получаете ресурс из своего контейнера, начиная транзакцию. Затем вашей JPA разрешено использовать транзакцию. Вам не хватает части, хотя вы не вызывали em.joinTransaction() после вызова ut.begin(). Это необходимо для привязки существующей EM к запущенной транзакции. Теперь он может работать, но ожидается, что он не будет работать в будущем. – Chris

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