Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用@Query和hibernate更新spring数据jpa中的布尔值_Hibernate_Spring Data_Spring Data Jpa - Fatal编程技术网

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

使用@Query和hibernate更新spring数据jpa中的布尔值,hibernate,spring-data,spring-data-jpa,Hibernate,Spring Data,Spring Data Jpa,我已经配置并运行了spring数据和hibernate。我可以使用spring数据保存记录,但由于某些原因,我无法运行将更新表中所有布尔字段的查询 我试过这个: @Query("update Content v set v.published = false where v.division = :division and v.section = :section") void unPublishContent(@Param("division") String division,

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

我试过这个:

@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);
我也试过:

@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);
参数划分和截面正在实现,但表上没有变化


p、 我也在使用mysql数据库。

要执行修改查询,您需要用一个附加的
@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);

我使用的是Spring3.1和SpringJPA数据。我也有类似的问题。在一个查询中更新多个记录时,我经常遇到错误

所以,我有类似的东西

@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
...
No value for key [org.apache.commons.dbcp.BasicDataSource (...) ] bound to thread
所以,我认为我的问题现在是一个事务问题,我回到谷歌去研究它,发现你必须现在添加@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);
但是我得到了以下错误:

...    
nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; 
nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query
...
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"/>


这是一次长途旅行,但我最终还是成功了。我希望这将有助于某些人,像许多其他人在他们精彩的博客、答案和评论中帮助我一样,努力“向前支付”。对我来说,它与以下注释一起工作:

@Modifying
@Query("update JsonContactImport x set x.isImported = true where x.id in :ids")
@Transactional
void updateImported(@Param("ids")  List<Long> ids);
修改 @查询(“更新JsonContactImport x set x.isImported=true,其中x.id在:ids中”) @交易的 void updateImported(@Param(“ids”)列表id);
对我来说,它也与以下注释一起工作:

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

使用Spring5时,仍然需要@Transactional注释

@Repository
public interface DoorStyleRepository extends JpaRepository<DoorStyle, Long> {

    @Modifying
    @Transactional
    @Query("UPDATE DoorStyle ds SET ds.enabled = false")
    void setEnabledFalse();
}
@存储库
公共接口DoorStyleRepository扩展了JpaRepository{
@修改
@交易的
@查询(“更新DoorStyle ds SET ds.enabled=false”)
void setEnabledFalse();
}

那么……这对你有用吗?我对你说的话有点困惑;)对不起,奥利弗,我有点累了,我打错了。不,这没用。据我所知,如果您的存储库使用只读注释,则此选项“@modify”非常有用。通过这种方式,您可以拥有一个主要是只读的I存储库,但它仍然允许您在其中包含写方法。这与
只读
,至少与直接无关
readOnly
是关于事务的,
@Modifying
是关于调用
EntityManager
。当然,尝试在只读事务中执行修改方法是没有意义的。不应该是必需的,因为Spring数据会自动将基于注释的事务应用于存储库接口。另外,请确保注释是从org.springframework.transaction.annotation导入的,而不是javaxPERFECT ANSWER!!非常感谢!