EntityManager返回的JPA的Query对象是否可重用?

时间:2012-06-27 14:32:31

标签: java jpa

假设我正处于创建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内重用一个实例,即在同一个交易中

3 个答案:

答案 0 :(得分:0)

我尝试了同样的事情,在循环中执行相同的查询(更新),并在第二次执行时得到“数据不匹配”。所以我把createQuery放在循环中,它运行正常。不完全是我所期望的。我会说它不是JPQL - 它是一个NamedNativeQuery。

答案 1 :(得分:-1)

可以重复使用Query。我已经尝试过工作了。

答案 2 :(得分:-5)

为什么不尝试使用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);