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

Spring Data JPA删除本机查询引发异常

赫连智
2023-03-14
问题内容

我有一个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.在说什么。记录确实从数据库中删除,但是此异常导致所有内容崩溃。

有人可以告诉我我在做什么错吗?


问题答案:

用@Query注释的方法执行查询以从数据库中读取。不更新数据库。为此,如文档所示,您需要@Modifying在方法中添加注释:

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

示例2.13 声明操作查询

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

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



 类似资料:
  • 我使用注释和注释执行查询,并从数据库表中删除记录。 错误: xxx的例外。xxx。xx,原因='javax。坚持不懈TransactionRequiredException:执行更新/删除查询“和异常=”执行更新/删除查询;嵌套的异常是javax。坚持不懈TransactionRequiredException:执行更新/删除查询'

  • 我正在使用hibernate data JPA。这是我的资源库 公共接口MappingRepository扩展了JpaRepository(ConfigMapping,Long){ 现在在我的服务类中,当我试图通过使用 所以我总是遇到例外 注意:vMList是作为Long列表的VM列表

  • 我想将resultset列表转换为entity类。我的本机查询:

  • 问题内容: 当我尝试从数据库中删除条目时,使用 然后我可以执行以下操作: 1)如果该行存在于数据库中,则将执行两个SQL查询:一个选择,然后一个删除 2)如果数据库中不存在该行,则仅执行选择查询 但是同样,更新不是这种情况。无论是否存在数据库行,都只会执行更新查询。 请让我知道为什么这种行为用于删除操作。这不是性能问题,因为遇到了两个查询而不是一个查询? 编辑: 我正在使用hibernate3.2

  • 以下示例将演示如何使用Delte查询,在DBUtils的帮助下删除记录。 我们将删除表中的一条记录。 语法 其中, deleteQuery − 删除包含占位符的查询。 queryRunner − 对象删除数据库中的员工对象。 为了理解上述与DBUtils相关的概念,我们编写一个将运行更新查询的示例。创建一个示例应用程序。 更新在DBUtils入门应用中创建的文件。 编译并运行应用程序,如下所述。

  • 员工与部门之间的关联是多对多的双向关联。 我正在尝试在删除受雇者之前删除关联