2013-09-27 128 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獲取來自PersistantContext的非事務性entityManager –

+0

是的,它需要一個事務。如果您不使用JTA,請將您的更改包裝在em.getTransaction()。begin(); em.getTransaction()提交();調用,否則你需要將你的方法包裝在一個事務中,或者從容器中查找來啓動它。 – Chris

回答

0

我做了一個醜陋的解決方法。我獲得了所有拍賣,然後我在for循環中獲得了所有過期拍賣,並最終合併了過期的autions。最後一件事是再次拍賣以返還它們。儘管使用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被允許使用該交易。儘管如此,你還是錯過了一部分,因爲你在ut.begin()調用之後沒有調用過em.joinTransaction()。這是將現有的EM與啓動的事務相關聯所必需的。它現在可能工作,但預計未來不會有效。 – Chris