Pregunta

Quiero actualizar todos los campos de una tabla que tiene un valor del nombre Colum como 'pcname'. El nombre de la tabla que quiero actualización es XYZ.I desea actualizar sólo algunos campos y no mantener algunos cambios.

Esto afectará muchas filas y no una sola fila, ya que habrá muchas filas con NAME = 'pcname' ¿Cómo puedo hacerlo usando JPA.I tienen clase de entidad asociada a esta tabla.

¿Fue útil?

Solución

Se puede hacer ya sea que la orientada a objetos u utilizando una consulta de actualización.

orientado a objetos:

public void setNameOfAllEntities(String newname){
    List<MyEntity> items =
        entityManager.createQuery("from MyEntity", MyEntity.class)
            .getResultList();
    for(MyEntity entity : items){
        entity.setName(newname);
    }
}

Con la Consulta de actualización (no probado):

public void setNameOfAllEntities(final String newname){

    final int changes =
        entityManager.createQuery("update MyEntity set name = :name")
            .setParameter("name", newname)
            .executeUpdate();

    System.out.println(changes + " rows changed");

}

Obviamente, la segunda versión funciona mejor.

Otros consejos

seanizer es es correcta (1) y una mayor actualización sería de hecho agradable para este caso de uso. Pero hay que tomar algunas precauciones con las operaciones de actualización mayor. Parafraseando la especificación JPA:

  • actualizaciones masivas Evita comprobaciones de bloqueo optimista (por lo que debe incrementar manualmente la columna de la versión y / o manualmente validar la columna de la versión si se desea)
  • el contexto de persistencia no es sincronizado con el resultado de las operaciones a granel (lo que las operaciones a granel deben realizarse en una transacción separada o en el principio de una transacción, antes de cargar el estado de cualquier entidad que puede verse afectada).

Mi sugerencia por lo tanto sería al menos de la subasta columna de la versión para evitar el problema de concurrencia con otros temas:

UPDATE XYZ xyz
SET xyz.name = :newname, xyz.version = xyz.version + 1 

Y para llevarla a cabo en una operación separada o antes de cargar cualquier XYZ como se explicó anteriormente.

Referencias

    especificación
  • JPA 1.0
    • Sección 4.10 "actualización masiva y operaciones de borrado"
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top