Spring Boot调用Oracle PL/SQL原生查询成功却抛出NegativeArraySizeException异常
异常触发原因
- 你的
insertAndForget属于DML写操作,但未添加@Modifying注解标识。Spring Data JPA默认将所有不带@Modifying的@Query方法判定为查询操作,会尝试读取并解析方法执行后的结果集。 - 你使用的PL/SQL匿名块执行完成后不会返回任何结果集,Hibernate在解析结果集元数据时获取到的返回列数为-1,后续初始化结果处理数组时直接抛出
NegativeArraySizeException: -1异常。 - 数据库端执行正常是因为PL/SQL本身逻辑无错误,该异常完全是应用层Hibernate解析不存在的结果集导致,和数据库执行逻辑无关。
解决方案
直接给insertAndForget方法添加@Modifying注解,标识该方法为修改操作,不需要解析返回结果集即可解决问题。如果当前调用上下文没有事务,建议同步添加@Transactional注解保证DML操作的事务支持。修改后的代码如下:
@Repository public interface SeenMessageRepository extends JpaRepository<SeenMessage, Long> { @Modifying @Transactional @Query(value = "begin " + "insert into SEEN_MESSAGE(ID, MESSAGE_ID, USER_ID, SEEN_DATE) " + "values(seen_message_seq.nextval, :MId , :UId , CURRENT_TIMESTAMP ); " + "exception " + "when dup_val_on_index THEN " + "RETURN; " + "end;", nativeQuery = true) void insertAndForget(Long MId, Long UId); }
内容的提问来源于stack exchange,提问作者Sobhan
相关产品推荐
相关产品推荐

