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

Hibernate调用Oracle函数报No query defined for that name错误如何解决

核心报错原因

JPA规范要求@NamedNativeQuery、@SqlResultSetMapping这类查询配置注解只能标注在被@Entity修饰的实体类上,你将两个注解标注在普通的Repository类TestDao上,JPA启动扫描时不会识别这部分配置,自然找不到名为getTestFunction的命名查询,因此抛出该报错。

修复步骤

1. 调整注解位置

将你定义的@SqlResultSetMapping和@NamedNativeQuery注解移动到项目中任意一个被@Entity修饰的实体类上即可,JPA会自动扫描所有实体类上的命名查询配置。

2. 补全POJO的全参构造方法

你使用了@ConstructorResult做结果映射,要求POJO必须存在和映射列顺序、类型匹配的构造方法,修改ResultPOJO如下:

public class ResultPOJO {
    private String ID;
    private String VALUE;

    // 新增和@ConstructorResult匹配的全参构造方法
    public ResultPOJO(String ID, String VALUE) {
        this.ID = ID;
        this.VALUE = VALUE;
    }

    // 原有getter、setter、无参构造方法保留即可
}

3. 修正参数索引

你定义的调用语句{? = call mySchema.MyPackage.getTestFunction(?,?)}中,第一个占位符?是函数返回值,对应索引0的位置不需要手动传参,你传入的两个入参对应的索引是1和2,修改TestDao的查询逻辑:

public List<ResultPOJO> getValues(String pParam1, LocalDate pParam2) {
    TypedQuery<ResultPOJO> q = entityManager.createNamedQuery("getTestFunction",ResultPOJO.class);
    // 修正参数索引从1开始
    q.setParameter(1, pParam1);
    // LocalDate转DATE类型适配Oracle字段
    q.setParameter(2, java.sql.Date.valueOf(pParam2));     
    return q.getResultList();       
}

可选替代方案(无需定义命名查询)

如果不想修改实体类的注解配置,可以直接通过StoredProcedureQuery直接调用函数,不需要提前配置命名查询:

@Transactional
@Repository
@SqlResultSetMapping(
    name = "testmapping",
    classes = {
            @ConstructorResult(
                    targetClass = ResultPOJO.class,
                    columns = {
                            @ColumnResult(name = "ID"),
                            @ColumnResult(name = "VALUE")
                    }
            )
    }
)
public class TestDao {
    public List<ResultPOJO> getValues(String pParam1, LocalDate pParam2) {
        // 直接声明存储函数调用,绑定结果映射
        StoredProcedureQuery query = entityManager.createStoredProcedureQuery(
                "mySchema.MyPackage.getTestFunction", 
                "testmapping"
        );
        // 注册返回值参数(索引1为游标返回值)
        query.registerStoredProcedureParameter(1, void.class, ParameterMode.REF_CURSOR);
        // 注册两个入参
        query.registerStoredProcedureParameter(2, String.class, ParameterMode.IN);
        query.registerStoredProcedureParameter(3, Date.class, ParameterMode.IN);
        // 赋值入参
        query.setParameter(2, pParam1);
        query.setParameter(3, java.sql.Date.valueOf(pParam2));
        return query.getResultList();
    }   
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:21:03