【问题标题】:SQLException: ResultSet is from UPDATE. No Data. Spring DataSQLException: ResultSet 来自 UPDATE。没有数据。弹簧数据
【发布时间】:2017-05-10 13:01:21
【问题描述】:

我为 MySQL 写了一个程序

CREATE DEFINER=`root`@`localhost` PROCEDURE `calculate_user_rank`()
BEGIN

DROP TABLE IF EXISTS `user_rank`;

CREATE TABLE `user_rank`
  AS (SELECT 
user.id, 
(SELECT COUNT(*)+1 FROM user_profile WHERE points>x.points) AS rank FROM 
user_profile x, user WHERE user.user_profile_id = x.id);

UPDATE user, user_rank SET user.rank = user_rank.rank WHERE user.id = user_rank.id;

END

此存储过程根据user_profile 表中的points 列计算用户排名,用数据创建一个新表user_rank,并从user_rank 表中更新userrank 列。

当我从 MySQL Workbench 执行这个存储过程时,它工作正常。但是当我从JpaRepository 调用它时:

@Transactional
@Query(nativeQuery = true, value = "CALL calculate_user_rank()")
void setUserRank();

抛出异常:

Caused by: org.hibernate.exception.GenericJDBCException: could not execute query
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109)
at org.hibernate.loader.Loader.doList(Loader.java:2620)
at org.hibernate.loader.Loader.doList(Loader.java:2600)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2429)
at org.hibernate.loader.Loader.list(Loader.java:2424)
...
Caused by: java.sql.SQLException: ResultSet is from UPDATE. No Data.
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1084)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:973)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:918)
at com.mysql.jdbc.ResultSetImpl.next(ResultSetImpl.java:6995)

程序有问题吗?

【问题讨论】:

  • 我对 JPA 不太熟悉,但错误表明 SP 是 UPDATE 类型,它不会返回结果集,就像在标准 java 中一样,您将使用 executeUpdate 运行它,而不是 executeQuery () .. 可能你需要告诉 JPA 这个 SP 不会返回结果集
  • @Yazan void 返回类型通知 JPA 我不期望任何结果。
  • 不是你的方法,它是当 JPA“引擎”执行这个 qry 时,它应该如何处理,引擎需要一个 ResultSet,一个标量值,什么都没有......这就是我的意思,它在一个不同的层,比你的方法可能低一点?

标签: java mysql spring spring-data-jpa


【解决方案1】:

不是注解@Query,是@Procedure

@Transactional
@Procedure(procedureName = "calculate_user_rank")
void setUserRank();

【讨论】:

  • 优秀。我可以在 4 分钟内接受答案。 LMAO。
  • 虽然我理解为什么@Procedure 应该工作,但我不明白为什么本机查询不工作。因为最终它是作为原始 SQL 查询执行的。对不对?
  • @ShubhamA。你是对的,但我 @Query 应该返回记录,除非你在方法上添加 @Modifying
【解决方案2】:

只添加@Modifying。

@Transactional
@Modifying
@Query(nativeQuery = true, value = "CALL calculate_user_rank()")
void setUserRank();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 2012-09-21
    • 1970-01-01
    • 2012-08-03
    • 2023-03-08
    相关资源
    最近更新 更多