hibernate3 调用oracle存储过程的方法

本文探讨了Hibernate配置文件中如何定义存储过程调用,并通过具体示例解释了如何正确设置参数,解决了一个常见错误:使用问号占位符时参数类型不匹配导致的ArrayStoreException。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

配置文件:

<hibernate-mapping>
    <class name="vo.SshPost" table="ssh_post" >
     <!-- <cache usage="read-write"/>-->
        <id name="postId" type="java.lang.String">
            <column name="post_id" />
            <generator class="native" />
        </id>
       
        <property name="postName" type="java.lang.String">
            <column name="post_name" length="20" />
        </property>
        <property name="postNo" type="java.lang.String">
            <column name="post_no" length="20" />
        </property>
        <filter name="myfilter" condition=":myfilterParam = post_name"/>
      
    </class>

<sql-query callable="true" name="selectAllUsers">
 <return class="vo.SshPost">
     <return-property name="postId" column="POST_ID"/>
     <return-property name="postName" column="POST_NAME"/>
     <return-property name="postNo" column="POST_NO"/>
 </return>
 { call P_TEST(?,:VPOSTNO) }
     </sql-query>


</hibernate-mapping>  

存储过程:

CREATE OR REPLACE PACKAGE TESTPACKAGE  AS

 TYPE Test_CURSOR IS REF CURSOR;

end TESTPACKAGE;

 

CREATE OR REPLACE PROCEDURE P_TEST(P_CURSOR OUT TESTPACKAGE.TEST_CURSOR,
                                   VPOSTNO  IN VARCHAR2) IS

BEGIN
  OPEN P_CURSOR FOR
    SELECT * FROM SSH_POST WHERE POST_NO = VPOSTNO;

END P_TEST;

 

如果不用PACKAGE  则可以使用

CREATE OR REPLACE PROCEDURE P_TEST(P_CURSOR OUT SYS_REFCURSOR,
                                   VPOSTNO  IN VARCHAR2) IS

 

程序调用:

Session session = sessionFactory.openSession();
  Query query = session.getNamedQuery("selectAllUsers");
  List list = query.setParameter("VPOSTNO", "99")

.list();
  System.out.println(list.size());

 

但是有个很郁闷的问题就是:

当 { call P_TEST(?,:VPOSTNO) } 改为 { call P_TEST(?,?) } 时

程序使用query.setParameter(1, "99")

系统居然报错:

java.lang.ArrayStoreException
 at java.lang.System.arraycopy(Native Method)
 at java.util.Arrays.copyOf(Unknown Source)
 at java.util.ArrayList.toArray(Unknown Source)
 at org.hibernate.util.ArrayHelper.toTypeArray(ArrayHelper.java:75)
 at org.hibernate.impl.AbstractQueryImpl.typeArray(AbstractQueryImpl.java:831)
 at org.hibernate.impl.AbstractQueryImpl.getQueryParameters(AbstractQueryImpl.java:839)
 at org.hibernate.impl.SQLQueryImpl.getQueryParameters(SQLQueryImpl.java:194)
 at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:152)

奇怪的hibernate

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值