当前位置: 首页 > 面试题库 >

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

牟焱
2023-03-14
问题内容

我已配置并运行spring-data和hibernate。我可以使用spring-
data保存记录,但是由于某些原因,我无法运行查询来更新表中的所有布尔字段。

我尝试了这个:

@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个查询中更新多个记录时,我一直遇到错误。

所以,我有这样的事情。

@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

因此,在搜索了一段时间后,我发现您必须添加@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
...

因此,我认为我的问题现在是交易问题,我回到Google进行研究,发现您必须立即添加@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

我再次搜索了一段时间,得出的结论是我的配置错误,事实证明这是正确的。我缺少一些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"/>

这是一段漫长的旅程,但我终于使它工作了。我希望这将对某人有所帮助,并尝试“偿还”,因为许多其他人通过他们的博客,答案和评论为我提供了帮助。



 类似资料:
  • 我已经配置并运行了spring数据和hibernate。我可以使用spring数据保存记录,但由于某些原因,我无法运行将更新表中所有布尔字段的查询。 我试过这个: 我也试过: 参数的划分和部分正在实现,但表上没有变化。 p、 我也在使用mysql数据库。

  • 为了测试@version注释,我使用以下设置来管理持久性: Spring Boot Starter 1.5.3.发布 Hibernate5.2.10.final Spring Data Envers 1.1.3.Release->Spring Data JPA 1.11.3.Release 测试的数据库: H2 PostgreSQL Mariadb 甲骨文 实体正在使用一个@version注释字段

  • 和 和 我的存储库:

  • 我有一些实体类,其id配置如下 接下来是我的问题。例如,第一天,我获取所有记录并保存它们。但是第二天我会再次得到所有的记录,包括第一天已经保存的记录。当我试着拯救第二天的时候会发生什么?是所有记录都将再次插入还是Spring数据只插入新记录,从第一天开始的旧记录将被更新?我需要第二种情况下的行为

  • 问题内容: 是否可以使用Spring Data JPA(由Hibernate作为JPA提供者支持)并同时直接使用Hibernate? 问题是,当我使用JpaTransactionManager时,无法使用检索当前会话。当我切换到HibernateTransaction Manager时,JPA存储库无法提交更改。 这是我的Spring上下文的一部分(在该上下文中,我无法使用直接的Hibernate

  • 我有一个更新查询: 我试图在集成测试中使用它: 但日志中没有显示与查找器相关的sql: 是否由于某些缓存原因而被忽略? 然后,如果我向findByEmail和findByLogin查找器添加一个调用,如下所示: 另一件让我困惑的事情是它显示了一个Limit2子句,尽管它应该只返回一个Admin对象。 我以为返回一个域对象时总会有一个限制1。这是对Spring数据的错误假设吗? 当粘贴到MySQL客