actualizando el valor booleano en Spring Data JPA usando @Query, con hibernación
Tengo Spring-Data e Hibernación configurados y en ejecución. Puedo guardar registros usando spring-data pero por alguna razón no puedo ejecutar una consulta que actualice todos los campos booleanos en una tabla.
Probé esto:
@Query("update Content v set v.published = false where v.division = :division and v.section = :section")
void unPublishContent(@Param("division") String division,
@Param("section") String section);
También probé esto:
@Query("update Content v set v.published = 0 where v.division = :division and v.section = :section")
void unPublishContent(@Param("division") String division,
@Param("section") String section);
Los parámetros de división y sección se están cumpliendo pero no hay cambios sobre la mesa.
PD: También estoy usando la base de datos MySQL.
Estoy usando Spring 3.1 y Spring JPA Data. Estaba teniendo un problema similar. Constantemente recibía un error al intentar actualizar varios registros en 1 consulta.
Entonces, tuve algo como esto.
@Query("UPDATE User u SET u.state = ?1 WHERE u.server.id = ?2")
public void updateAllUsers(long state, long serverid);
Error:
org.hibernate.hql.QueryExecutionRequestException: Not supported for DML operations
Entonces, después de buscar en Google por un tiempo, descubrí que tenías que agregar @Modifying.
@Modifying
@Query("UPDATE User u SET u.state = ?1 WHERE u.server.id = ?2")
public void updateAllUsers(long state, long serverid);
Pero luego recibí el siguiente error:
...
nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query;
nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query
...
Entonces, pensé que mi problema ahora era un problema de transacción y volví a Google para investigarlo y descubrí que tenía que agregar @Transactional ahora. Parece que @Modifying también requiere @Transactional.
@Modifying
@Transactional
@Query("UPDATE User u SET u.state = ?1 WHERE u.server.id = ?2")
public void updateAllUsers(long state, long serverid);
pero luego recibí el siguiente error:
No value for key [org.apache.commons.dbcp.BasicDataSource (...) ] bound to thread
Nuevamente busqué en Google por un tiempo y llegué a la conclusión de que mi configuración era incorrecta y resultó ser cierta. Me faltaban algunas configuraciones xml.
<beans:bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
<beans:property name="entityManagerFactory" ref="entityManagerFactory"/>
</beans:bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
Fue un largo viaje pero finalmente lo hice funcionar. Espero que esto ayude a alguien, tratando de "retribuirlo", ya que muchos otros me han ayudado con sus maravillosos blogs, respuestas y comentarios.
Para ejecutar consultas de modificación, debe anotar el método con un adicional @Modifying
como se describe en la documentación de referencia como este:
@Modifying
@Query("update Content v set v.published = false where v.division = :division and v.section = :section")
void unPublishContent(@Param("division") String division,
@Param("section") String section);