【问题标题】:Spring Data JPA delete native query throwing exceptionSpring Data JPA删除本机查询抛出异常
【发布时间】:2013-11-13 19:53:35
【问题描述】:

我有一个User 实体和一个Role 实体。关系定义如下:

@OneToMany
@JoinTable(name="USER_ROLES", inverseJoinColumns=@JoinColumn(name="ROLE_ID"))
private List<Role> roles = null; 

现在,当我删除一个角色时,我需要从所有拥有该角色的用户中删除该角色。通常,您会通过查找具有此角色的所有用户、从列表中删除该角色并保存该用户来执行此类操作。但是,当可能有超过一百万用户时,我不想在应用程序中循环访问这么多实体。所以,我想使用本机查询从USER_ROLES 连接表中删除行。我尝试将此添加到我的存储库:

@Query(value="DELETE FROM user_roles WHERE role_id = ?1", nativeQuery=true)
public void deleteRoleFromUsersWithRole(Long roleId);

但是,当我这样做时,我会在日志中看到以下内容:

[EL Fine]: sql: 2013-11-02 14:27:14.418--ClientSession(707349235)--Connection(2096606500)--Thread(Thread[http-bio-8080-exec-4,5,main])--DELETE FROM user_roles WHERE role_id = ?
   bind => [1000110139999999953]
[EL Fine]: sql: 2013-11-02 14:27:14.478--ClientSession(707349235)--Thread(Thread[http-bio-8080-exec-4,5,main])--SELECT 1
[EL Warning]: 2013-11-02 14:27:14.482--UnitOfWork(1795045370)--Thread(Thread[http-bio-8080-exec-4,5,main])--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.4.1.v20121003-ad44345): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: No results were returned by the query.
Error Code: 0
Call: DELETE FROM user_roles WHERE role_id = ?
    bind => [1000110139999999953]
Query: DataReadQuery(sql="DELETE FROM user_roles WHERE role_id = ?")

我不明白No results were returned by the query. 在说什么。记录确实从数据库中删除了,但是这个异常导致一切都崩溃了。

谁能告诉我我在这里做错了什么?

【问题讨论】:

    标签: java jpa spring-data-jpa nativequery


    【解决方案1】:

    带有@Query 注释的方法执行查询以便从数据库中读取。不更新数据库。为此,正如the documentation 所指出的,您需要在方法中添加@Modifying 注释:

    以上所有部分都描述了如何声明查询以访问给定实体或实体集合。当然,您可以使用第 1.3 节“Spring 数据存储库的自定义实现”中描述的工具添加自定义修改行为。由于这种方法对于全面的自定义功能是可行的,因此您可以通过使用@Modifying注释查询方法来实现修改实际上只需要参数绑定的查询的执行:

    示例 2.13。声明操纵查询

    @Modifying
    @Query("update User u set u.firstname = ?1 where u.lastname = ?2")
    int setFixedFirstnameFor(String firstname, String lastname);
    

    这将触发注释到方法的查询作为更新查询而不是选择一个。

    【讨论】:

    • 啊,我对 Spring Data 和 JPA 还是很陌生。我想我应该花更多的时间在文档上。我应该注意,我还必须添加 @Transactional 注释才能使其正常工作。感谢您的帮助。
    • 这个 int 在这里返回什么?
    • 为什么不支持Delete语句?
    【解决方案2】:

    使用这两个注解

    import org.springframework.data.jpa.repository.Modifying;
    import org.springframework.transaction.annotation.Transactional;
    
    @Modifying
    @Transactional
    

    【讨论】:

    • 这个答案不会添加任何不在接受的答案中的内容,@dnc253 对此发表评论
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    相关资源
    最近更新 更多