Atualizando várias linhas usando JPA
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.
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"