又写了一个简化些的Hibernate存储过程示例,仍然报错,不知所云,请各位帮忙给看看,谢谢。程序代码如下:一、类文件package hello;public class Item { private Long id;
private String name;
private String description; public Item() { } public Item(String name) {
this.name = name;
} public Long getId() {
return id;
} public void setId(Long id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getDescription() {
return description;
} public void setDescription(String description) {
this.description = description;
}}二、hibernate映射文件Item.hbm.xml<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping> <class name="hello.Item" table="ITEM_SQLQP1_H"> <id name="id">
<column name="ITEM_ID" />
<generator class="sequence">
<param name="sequence">SEQ_ITEM_SQLQP1_H</param>
</generator>
</id> <property name="name" type="string">
<column name="I_NAME" length="70" not-null="true" />
</property> <property name="description" type="string">
<column name="I_DESCRIPTION"></column>
</property> </class>         <!-- 存储过程调用 -->
<sql-query name="selectAllItems" callable="true">
<return alias="i" class="hello.Item">
<return-property name="id" column="ITEM_ID"></return-property>
<return-property name="name" column="I_NAME"></return-property>
<return-property name="description" column="I_DESCRIPTION"></return-property>
</return>
[color=#FF0000]{ call SELECT_ALL_ITEMS(?, :IN_ID) }
</sql-query>[/color]</hibernate-mapping>三、Oracle存储过程CREATE OR REPLACE PROCEDURE SELECT_ALL_ITEMS (

OUT_RESULT out SYS_REFCURSOR,
IN_ID in number
)
AS BEGIN 
    
OPEN OUT_RESULT FOR 
    
SELECT i.ITEM_ID  as ITEM_ID,
i.I_NAME  as I_NAME,
i.I_DESCRIPTION as I_DESCRIPTION

FROM ITEM_SQLQP1_H i

WHERE i.ITEM_ID > IN_ID;

END; 
/

四、数据库表create table ITEM_SQLQP1_H(
ITEM_ID number not null ,
I_NAME varchar2(277),
I_DESCRIPTION varchar2(277),
primary key (ITEM_ID),
unique(I_NAME)
);create sequence SEQ_ITEM_SQLQP1_Hminvalue 1
maxvalue 999999999999999999999999999
start with 71
increment by 1
cache 20;
五、主程序package hello;import java.util.Iterator;
import java.util.List;import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;import persistence.HibernateUtil;public class ItemBidsSetMain { @SuppressWarnings("unchecked")
public static void main(String[] args) throws Exception { Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction(); Item one = new Item("one");
one.setDescription("lala..............."); session.save(one); Item two = new Item("two");
two.setDescription("lele...............");
session.save(two); tx.commit();
session.close();
//
// /**
// * HQL查询
// */
Session secondSession = HibernateUtil.getSessionFactory().openSession();
Transaction secondTransaction = secondSession.beginTransaction();

Query q = secondSession.getNamedQuery("selectAllItems");
q.setParameter("IN_ID", 71);
List<Item> itemList = q.list();//此处报错
//
// for (Iterator<Item> iter = itemList.iterator(); iter.hasNext();) {
// Item item = iter.next();
// System.out.println("-----------------------------------------");
// System.out.println(item.getName());
// System.out.println("-----------------------------------------");
//
// } secondTransaction.commit();
secondSession.close(); }
}六、错误描述Hibernate: 
    /* named native SQL query selectAllItems */ { call SELECT_ALL_ITEMS(?, ?) }
Exception in thread "main" java.lang.NullPointerException
at oracle.jdbc.ttc7.TTCAdapter.newTTCType(TTCAdapter.java:300)
at oracle.jdbc.ttc7.TTCAdapter.createNonPlsqlTTCColumnArray(TTCAdapter.java:272)
at oracle.jdbc.ttc7.TTCAdapter.createNonPlsqlTTCDataSet(TTCAdapter.java:232)
at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1934)
at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:1141)
at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:2149)
at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:2032)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2894)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:608)
at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:684)
at com.mchange.v2.c3p0.impl.NewProxyCallableStatement.execute(NewProxyCallableStatement.java:2966)
at org.hibernate.dialect.Oracle9Dialect.getResultSet(Oracle9Dialect.java:284)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:193)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1665)
at org.hibernate.loader.Loader.doQuery(Loader.java:662)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.doList(Loader.java:2144)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2028)
at org.hibernate.loader.Loader.list(Loader.java:2023)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:289)
at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1695)
at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142)
at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:150)
at hello.ItemBidsSetMain.main(ItemBidsSetMain.java:42)

解决方案 »

  1.   

    晕啦,q为null和你的存储过程有傻关系?
    配置文件的问题
      

  2.   

    Hibernate中使用存储过程,对于Sybase或者MS SQL server有如下规则: 存储过程必须返回一个结果集。.注意这些servers可能返回多个结果集以及更新的数目.Hibernate将取出第一条结果集作为它的返回值, 其他将被丢弃

    q.list();//此处报错 改为query.uniqueResult()
      

  3.   

    还不行,把这里
     {call SELECT_ALL_ITEMS(?, :IN_ID) } 
    改为
     {call SELECT_ALL_ITEMS(?) } q.setParameter("IN_ID", 71); 
    改为
    query.setInteger(1,71);看看
      

  4.   

    http://blog.csdn.net/jenny537/archive/2009/09/24/4588732.aspx
    给你个例子看看
      

  5.   

    结果异常:Exception in thread "main" java.lang.IllegalArgumentException: Positional parameter does not exist: 1 in query: { call SELECT_ALL_ITEMS(?) }
    at org.hibernate.impl.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:335)
    at org.hibernate.impl.AbstractQueryImpl.setLong(AbstractQueryImpl.java:489)
    at hello.ItemBidsSetMain.main(ItemBidsSetMain.java:41)
      

  6.   


    这片文章很好,收藏了,但是这篇文章描述Hibenate调用存储过程方式是使用传统的JDBC,而不是使用Hibernate自己的机制。