actualizando el valor booleano en Spring Data JPA usando @Query, con hibernación

Resuelto aki asked hace 12 años • 5 respuestas

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.

aki avatar Apr 19 '12 08:04 aki
Aceptado

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.

TchiYuan avatar Sep 14 '2012 14:09 TchiYuan

Para ejecutar consultas de modificación, debe anotar el método con un adicional @Modifyingcomo 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);
Oliver Drotbohm avatar Apr 19 '2012 07:04 Oliver Drotbohm