2012-06-27 66 views
5

比方說,我是在一個循環中創建JPA查詢:由EntityManager返回的JPA查詢對象是否可重用?

for(A elem : collection) { 
    emanager.createQuery("update A a set a.x=:y where a.id=:id") 
      .setParameter("id",elem.id) 
      .setParameter(":y", 123) 
      .executeUpdate(); 
} 

我可以將返回Query實例?

Query query = emanager.createQuery("update A a set a.x=:y where a.id=:id"); 
for(A elem : collection) { 
    query 
      .setParameter("id",elem.id) 
      .setParameter(":y", 123) 
      .executeUpdate(); 
} 

是否申請的Query所有實例? NamedQueryNativeQuery等 當然,我說的是同一個EntityManager內重複使用的情況下,即同一交易

回答

-1

它是可重複使用的查詢中。據我嘗試工作。

+0

謝謝,你有什麼(例如:規範)來支持?或者是你自己的經驗? –

+0

這只是我的經驗。 – yerlikayaoglu

+3

從JPA 2.1規範的「3.1.1 EntityManager接口」部分:_實體管理器獲得的Query,TypedQuery,StoredProcedureQuery,CriteriaBuilder,Metamodel和EntityTransaction對象在該實體管理器處於打開狀態時有效._ –

-4

爲什麼不試試EntityManager方法來持久化,更新和刪除寄存器到數據庫?

emanager.persist(elem); // creates a register in the database, set the annotation for autoincrement id of new registers in the Entity for better performance. 

emanager.merge(elem); // updates a register in the database, chance the values of the Entity values and merge to persist changes to the register. 

emanager.remove(emanager.merge(elem)); // delete registers from database, you need to merge de entity before deleting to avoid deleting problems. 

這樣你就可以做到這一點,將正常工作:

for(A elem : collection) emanager.merge(elem); 
+0

-1:你看過這個問題嗎?這是如何回答的? –

+0

您正在進行查詢以更新註冊表,希望以更高效的方式創建註冊表,以便詢問您是否可以重新使用Query實例。那麼,我告訴你用JPA進行更新的最有效方法。 – memozac

+0

你的方式實際上比OP的效率低(提示:合併需要選擇和更新),而你的答案不能確定查詢是否可重用。 –

0

我想這同樣的事情,執行一個循環中相同的查詢(更新),我得到的「數據不匹配」第二次執行。所以我把createQuery放在循環中,並且工作正常。不完全是我所期望的。我會說它不是JPQL - 它是一個NamedNativeQuery。