2012-06-27 14 views
5

Digamos que estoy en un bucle de creación de consultas de JPA:¿Son los objetos de consulta de JPA devueltos por un EntityManager reutilizable?

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(); 
} 

¿Puedo volver a utilizar el vuelto Query ejemplo?

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(); 
} 

¿Se aplica para todas las instancias de Query? NamedQuery, NativeQuery, etc Por supuesto, estoy hablando de la reutilización de una instancia dentro de la misma EntityManager, es decir, dentro de la misma transacción

Respuesta

-1

Es reutilizable para consulta. Por lo que he intentado trabajar.

+0

Gracias, ¿tiene algo (por ejemplo: especificaciones) para respaldar esto? ¿O es tu propia experiencia? –

+0

Es solo mi experiencia. – yerlikayaoglu

+3

De la especificación JPA 2.1, sección "3.1.1 Interfaz EntityManager": _ Los objetos Query, TypedQuery, StoredProcedureQuery, CriteriaBuilder, Metamodel y EntityTransaction obtenidos de un administrador de entidades son válidos mientras ese administrador de entidades está abierto._ –

-4

¿Por qué no prueba los métodos de EntityManager para conservar, actualizar y eliminar registros en la base de datos?

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. 

para que pueda hacer esto y va a funcionar bien:

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

-1: ¿has leído la pregunta? ¿Cómo responde eso? –

+0

Está realizando una consulta para actualizar un registro, desea hacerlo de una manera más eficiente, por lo que le preguntará si puede reutilizar la instancia de Query. Bueno, te estoy diciendo la forma más eficiente de hacer actualizaciones con JPA. – memozac

+0

Su forma es en realidad * menos * eficiente que lo que hace el OP (sugerencia: una combinación necesita una selección y una actualización), y su respuesta no indica si la consulta es reutilizable o no. –

0

yo probamos este exactamente lo mismo, ejecutar la misma consulta (actualización) dentro de un bucle, y me da "discordancia de datos" en la la 2da ejecución. Así que puse el createQuery dentro del bucle, y funciona bien. No es exactamente lo que hubiera esperado. Diré que no es JPQL, es una NamedNativeQuery.

Cuestiones relacionadas