首页 > 解决方案 > Hibernate:没有定义查询(没有实体类)

问题描述

有一些相关的问题,例如:

但是,它收到错误:没有为该名称定义查询 [getTestFunction],我儿子不知道该尝试什么了。

我的 Oracle 函数

FUNCTION mySchema.MyPackage.getTestFunction(pParam1 VARCHAR2, pParam2 DATE) RETURN SYS_REFCURSOR AS
    result SYS_REFCURSOR; 
BEGIN
    OPEN result FOR
        SELECT 123 AS "ID", 'abc' AS "VALUE" FROM DUAL 
        UNION ALL
        SELECT 456 AS "ID", 'def' AS "VALUE" FROM DUAL 
        UNION ALL
        SELECT 789 AS "ID", 'ghi' AS "VALUE" FROM DUAL; 
    RETURN result; 
END getTestFunction;

我的 POJO

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

我的仓库

@Transactional
@Repository
@SqlResultSetMapping(
    name = "testmapping",
    classes = {
            @ConstructorResult(
                    targetClass = ResultPOJO.class,
                    columns = {
                            @ColumnResult(name = "ID"),
                            @ColumnResult(name = "VALUE")
                    }
            )
    }
)
@NamedNativeQuery(
    name = "getTestFunction", 
    callable = true, 
    query = "{? = call mySchema.MyPackage.getTestFunction(?,?)}",
    resultSetMapping = "testmapping"
    )
public class TestDao {
    public List<ResultPOJO> getValues(String pParam1, LocalDate pParam2) {
        TypedQuery<ResultPOJO> q = entityManager.createNamedQuery("getTestFunction",ResultPOJO.class);
        q.setParameter(0, pParam1);
        q.setParameter(1, pParam2);     
        return q.getResultList();       
    }   
}

我错过了什么?

标签: javaoraclespring-boothibernate

解决方案


JPA 注释仅对实体有效,我也认为对 package-info.java 文件有效,但某些注释只能应用于类,因此您可能需要一种“虚拟实体”。你可以这样定义:

@Entity
@Subselect("select 1 as id from dual")
public class Dual {
  @Id
  Integer id;
}

然后,您可以@NamedNativeQuery在该类上定义 。请注意,尽管您需要在 Spring 项目中启用实体扫描,但对于您将放入此类的包。


推荐阅读