Pergunta

Quero atualizar todos os campos de uma tabela com valor do nome do colum como 'PCName'. O nome da tabela que eu quero atualizar é XYZ.Eu quero atualizar apenas alguns campos e não manter alguns inalterados.

Isso afetará muitas linhas e não uma única linha, pois haverá muitas linhas com nome = 'pcName' Como posso fazer isso usando o jpa.i tenho a classe de entidade associada a esta tabela.

Foi útil?

Solução

Você pode fazê -lo da maneira orientada ao objeto ou usar uma consulta de atualização.

Orientado a Objeto:

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

Com a consulta de atualização (não testada):

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, a segunda versão tem um desempenho melhor.

Outras dicas

Seanizer responda está correto (+1) e uma atualização em massa seria realmente boa para este caso de uso. Mas você deve tomar algumas precauções com operações de atualização em massa. Parafraseando a especificação JPA:

  • Atualizações em massa de ignorar verificações otimistas de bloqueio (Portanto, você deve incrementar manualmente a coluna da versão e/ou validar manualmente a coluna da versão, se desejar)
  • O contexto de persistência não é sincronizado com o resultado de operações em massa (Portanto, as operações em massa devem ser realizadas em uma transação separada ou no início de uma transação, antes de carregar o estado de qualquer entidade que possa ser afetada).

Minha sugestão seria, portanto, pelo menos incrementar a coluna da versão para evitar problemas de simultaneidade com outros threads:

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

E executá -lo em uma transação separada ou antes de carregar qualquer XYZ, conforme explicado anteriormente.

Referências

  • Especificação JPA 1.0
    • Seção 4.10 "Atualização em massa e exclusão de operações"
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top