You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hibernate原生查询参数设置问题:存储过程返回结果异常

原生查询调用存储过程返回错误结果的问题排查

嘿,我一眼就发现你这段代码里有两个关键问题,这就是为啥调用getAmount方法拿不到正确值,但直接在数据库执行相同参数的查询却正常的原因:

  • 参数顺序完全搞反了
    你的方法getAmount的参数是(String userId, String companyId),但在设置原生查询的占位符时,你把companyId传给了第一个?,userId传给了第二个?:

    .setParameter(1, companyId).setParameter(2, userId)
    

    结合你直接在数据库执行能得到正确结果的情况,说明你在数据库里执行时,是把userId放在第一个参数位置、companyId放在第二个位置调用存储过程的。代码里的参数顺序完全颠倒,存储过程拿到的参数不对,自然返回错误结果。

  • 错误使用了getFirstResult()方法
    别搞混JPA的方法啦!getFirstResult()是用来设置分页查询的起始位置的(比如想从第10条数据开始查,就用setFirstResult(9)),根本不是用来获取查询结果的。你要获取这个单行单列的存储过程返回值,应该用getSingleResult()方法。用getFirstResult()在这里只会返回一个默认的无效数值(通常是0),转成字符串肯定不是你想要的结果。

修正后的代码示例

public String getAmount(String userId, String companyId) {
    // 这里要确保参数顺序和存储过程定义的一致,根据你数据库执行的正确顺序调整
    Integer amount = (Integer) entityManager.createNativeQuery("SELECT scan.attorney.Get_Amount(?, ?) AS amount FROM DUAL")
            .setParameter(1, userId) // 和你数据库执行时的参数顺序对应
            .setParameter(2, companyId)
            .getSingleResult(); // 改用getSingleResult获取单个结果
    return amount.toString();
}

另外提醒下:一定要再核对下存储过程Get_Amount的参数定义顺序,确保代码里的参数传递和存储过程要求的顺序完全匹配——这是调用存储过程时最容易踩的坑!

内容的提问来源于stack exchange,提问作者fatherazrael

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:47:11