使用@Query使用hibernate更新spring数据jpa中的布尔值

我有弹簧数据和hibernateconfiguration和运行。 我可以使用spring-data保存logging,但由于某些原因,我无法运行将更新表中所有布尔字段的查询。

我试过这个:

@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); 

我也试过这个:

  @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); 

参数分区和部分实现,但没有变化的表格。

ps我也使用mysql数据库。

我正在使用Spring 3.1和Spring JPA数据。 我有一个类似的问题。 在尝试更新1个查询中的多个logging时,我经常发生错误。

所以,我有这样的事情。

 @Query("UPDATE User u SET u.state = ?1 WHERE u.server.id = ?2") public void updateAllUsers(long state, long serverid); 

错误:

 org.hibernate.hql.QueryExecutionRequestException: Not supported for DML operations 

所以googlesearch一下之后,我发现你必须添加@Modifying。

 @Modifying @Query("UPDATE User u SET u.state = ?1 WHERE u.server.id = ?2") public void updateAllUsers(long state, long serverid); 

但后来我得到以下错误:

 ... nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query ... 

所以,我认为我的问题现在是一个交易问题,我回到谷歌研究它,发现你现在必须添加@Transactional。 看起来@Modifying也需要@Transactional。

 @Modifying @Transactional @Query("UPDATE User u SET u.state = ?1 WHERE u.server.id = ?2") public void updateAllUsers(long state, long serverid); 

但后来我得到了以下错误:

 No value for key [org.apache.commons.dbcp.BasicDataSource (...) ] bound to thread 

我再次search一下,得出结论:我的configuration是错误的,事实certificate是正确的。 我错过了一些XMLconfiguration。

 <beans:bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager"> <beans:property name="entityManagerFactory" ref="entityManagerFactory"/> </beans:bean> <tx:annotation-driven transaction-manager="transactionManager"/> 

这是漫长的旅程,但我终于得到它的工作。 我希望这会帮助别人,试图“付出代价”,就像其他许多人用他们精彩的博客,答案和评论帮助我一样。

要执行修改查询,您需要使用附加@Modifying来注释该方法,如参考文档中所述:

 @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); 

对我来说,它也适用于以下注释:

 @Modifying @Query("update User u set u.active=1 where a.id=?1") @Transactional void activeUser(Long id); 

对我来说,它使用以下注释:

 @Modifying @Query("update JsonContactImport x set x.isImported = true where x.id in :ids") @Transactional void updateImported(@Param("ids") List<Long> ids);