2013-09-27 125 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