休眠没有找到具有该名称的@NamedStoredProcedureQuery

Posted

技术标签:

【中文标题】休眠没有找到具有该名称的@NamedStoredProcedureQuery【英文标题】:Hibernate No @NamedStoredProcedureQuery was found with that name 【发布时间】:2016-11-10 21:13:08 【问题描述】:

我正在尝试使用 hibernate 的实体管理器从 db2 数据库调用存储过程,并将结果作为对象返回。我正在使用休眠似乎找不到的@NamedStoredProcedureQuery 注释。我收到错误消息:“没有找到具有该名称的@NamedStoredProcedureQuery:Create_Division”。任何想法都会很棒。

豆子:

<bean id="entityManagerFactoryBean"  class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="persistenceUnitName" value="demoJPAUnit" />
    <property name="packagesToScan">
        <list>
            <value>com.merchantBoarding.db2.queryObjects</value>
        </list>
    </property>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.archive.autodetection">class,hbm</prop>
            <prop key="hibernate.hbm2ddl.auto">create</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.DB2Dialect</prop>
        </props>
    </property>
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactoryBean" />
</bean>

查询输出对象:

@NamedStoredProcedureQuery(
        name="Create_Division",
        procedureName="MD.PMDBD017",
        resultClasses = CreateDivisionResult.class,
        parameters=
                @StoredProcedureParameter(name="IN_ENTY",mode=ParameterMode.IN,type=Integer.class),
                @StoredProcedureParameter(name="IN_PARNT_ENTY",mode=ParameterMode.IN,type=Integer.class),
                @StoredProcedureParameter(name="IN_ACTION",mode=ParameterMode.IN,type=String.class),
                @StoredProcedureParameter(name="IN_ENTY_XREF",mode=ParameterMode.IN,type=String.class),
                @StoredProcedureParameter(name="OUT_ENTY",mode=ParameterMode.OUT,type=Integer.class),
                @StoredProcedureParameter(name="OUT_ID",mode=ParameterMode.OUT,type=String.class),
                @StoredProcedureParameter(name="OUT_ENTY_XREF",mode=ParameterMode.OUT,type=String.class),
                @StoredProcedureParameter(name="OUT_SQLCODE",mode=ParameterMode.OUT,type=Integer.class),
                @StoredProcedureParameter(name="OUT_STATUS",mode=ParameterMode.OUT,type=String.class),
                @StoredProcedureParameter(name="OUT_ERRORTEXT",mode=ParameterMode.OUT,type=String.class),
        
)
public class CreateDivisionResult implements Serializable 

    @Id
    public String OUT_ENTY;
    public String OUT_ID;
    public String OUT_ENTY_XREF;
    public String OUT_SQLCODE;
    public String OUT_STATUS;
    public String OUT_ERRORTEXT;


DAO 代码:

StoredProcedureQuery query = manager.createNamedStoredProcedureQuery("Create_Division");
query.setParameter("IN_ENTY", 111);
query.setParameter("IN_PARNT_ENTY", 11111);
query.setParameter("IN_ACTION", "CREATE");
query.setParameter("IN_ENTY_XREF", "ED");
List<CreateDivisionResult> results = query.getResultList();

编辑: 所以我添加了@Entity 并且确实修复了原始错误,但输出参数仍然没有映射到 CreateDivisionResult 对象。我只能使用 query.getOutputParameterValue 获取每个单独的字段。这只是JPA的限制吗?

【问题讨论】:

您是否设法解决了 query.getOutputParameterValue 问题?即使我只在 query.getOutputParameterValue 而不是在 resultSet 中得到结果 不幸的是我从来没有这样做过。它最终只是一个臃肿的 DAO。您可以尝试查看 Spring 数据。这仅显示了使用单个字符串执行 orm 的示例,但如果您有时间,可以尝试使用整个对象进行操作:[dzone.com/articles/… 【参考方案1】:

@NamedStoredProcedureQuery 应该应用于实体类或映射类

您的“CreateDivisionResult”中似乎缺少@Entity

【讨论】:

感谢您的回复。所以我的理解是 @Entity 将类与数据库中的特定表联系起来。在这种情况下,输出字段不来自任何表。它们只是从存储过程本身产生的。这仍然是我会使用@Entity 的情况吗? 两天两天后,你向我展示了通往荣耀的道路 :) 如果 NamedStoredProcedure 没有绑定到特定实体,而是在数据库中设置了对多个实体有效的状态怎么办?我们肯定不会在每个实体类中复制它吗?如果我将它分成一个类,它会抱怨它找不到 NSP。如果我让它成为一个实体,它希望我设置一个@Id。我没有,它不是这样的实体......

以上是关于休眠没有找到具有该名称的@NamedStoredProcedureQuery的主要内容,如果未能解决你的问题,请参考以下文章

从会话工厂以编程方式获取休眠默认模式名称?

休眠等于方法

休眠映射 - 在类中找不到属性名称的设置器

如何让jpa休眠创建具有多对一但没有外键的实体

我们如何使用没有标签名称的 xpath 查找元素? [复制]

Spring和休眠:没有为当前线程找到会话