大家好,上次做了一个Hibernate使用存储过程的示例,经过了一番研究之后,终于有了一点点进展,目前的状况是,存储过程已经能够访问到,也使用了OUT参数和IN参数,但是报出了一个空指针的错误,不知道哪里还有问题,请各位帮忙给看看。 我将我的示例的完整代码列出: 
表及存储过程: [b][/b]/* Set映射类型 */ drop table BID_PD_H; create table BID_PD_H[b]( [/b]
BID_ID number not null, 
ITEM_ID number not null, 
AMOUNT_CURRENCY number, 
primary key (BID_ID) 
); 
drop table ITEM_PD_H; create table ITEM_PD_H[b]( [/b]
ITEM_ID number not null , 
NAME varchar2(277), 
DESCRIPTION varchar2(277), 
ITEM_DATE date, 
primary key (ITEM_ID), 
unique(NAME) 
); ALTER TABLE BID_PD_H ADD (CONSTRAINT  fk_bid_PD_h_1 FOREIGN KEY (ITEM_ID) REFERENCES ITEM_PD_H(ITEM_ID)); 
drop sequence SEQ_ITEM_PD_H; -- Create sequence 
create sequence SEQ_ITEM_PD_H [b][/b]
minvalue 1 
maxvalue 999999999999999999999999999 
start with 71 
increment by 1 
cache 20; drop sequence SEQ_BID_PD_H; -- Create sequence 
create sequence SEQ_BID_PD_H [b][/b]
minvalue 1 
maxvalue 999999999999999999999999999 
start with 71 
increment by 1 
cache 20; 
commit; 
DROP PROCEDURE selectAllItems; CREATE OR REPLACE PROCEDURE SELECT_ALL_ITEMS[b] [/b]( OUT_RESULT out SYS_REFCURSOR, 
IN_ID in number ) AS BEGIN 
    
OPEN OUT_RESULT FOR 
    
SELECT i.ITEM_ID as ITEM_ID, 
i.NAME as NAME, 
i.DESCRIPTION as DESCRIPTION, 
i.ITEM_DATE as ITEM_DATE 
FROM ITEM_PD_H i WHERE i.ITEM_ID = IN_ID; 
    END; 

一、类文件: package hello; 
import java.util.Calendar; 
import java.util.Date; 
import java.util.HashSet; 
import java.util.Set; public class Item { private Long id; 
private String name; 
private String description; 
private String stringDate; 
private Date sqlDate; 
private Set <Bid> bids = new HashSet <Bid>(); 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 Set <Bid> getBids() { 
return bids; 
} public void setBids(Set <Bid> bids) { 
this.bids = bids; 
} public void addBid(Bid bid) { 
bid.setItem(this); 
bids.add(bid); 
} public String getDescription() { 
return description; 
} public void setDescription(String description) { 
this.description = description; 
} public String getStringDate() { 
return stringDate; 
} public void setStringDate(String stringDate) { 
this.stringDate = stringDate; 
int year = Integer.parseInt(this.stringDate.substring(0,4)); 
int month = Integer.parseInt(this.stringDate.substring(5,7)); 
int day = Integer.parseInt(this.stringDate.substring(8)); System.out.println(year); 
//DateFormat ft = new SimpleDateFormat("HH:mm:ss"); 
Calendar cd = Calendar.getInstance(); 
cd.set(year, month-1, day); 
setSqlDate(cd.getTime()); 
} public Date getSqlDate() { 
return sqlDate; 
} public void setSqlDate(Date sqlDate) { 
this.sqlDate = sqlDate; 
} } package hello; public class Bid {     private Long id = null; 
private Item item; 
private int amountCurrency;   
public Bid() {} public Bid(int amountCurrency){ 
this.amountCurrency=amountCurrency; 
} // ********************** Accessor Methods ********************** // public Long getId() { return id; } 
public Item getItem() { return item; } 
public void setId(Long id) { 
this.id = id; 

public void setItem(Item item) { 
this.item = item; 

public int getAmountCurrency() { 
return amountCurrency; 

public void setAmountCurrency(int amountCurrency) { 
this.amountCurrency = amountCurrency; 
} } 二、映射元数据文件 

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_PD_H"> <id name="id"> 
<column name="ITEM_ID" /> 
<generator class="sequence"> 
<param name="sequence">SEQ_ITEM_PD_H </param> 
</generator> 
</id> <property name="name" type="string"> 
<column name="NAME" length="70" not-null="true" /> 
</property> <property name="description" type="string"> 
<column name="DESCRIPTION"> </column> 
</property> <property name="sqlDate" type="date"> 
<column name="ITEM_DATE"> </column> 
</property> <set name="bids" inverse="false" cascade="save-update"> 
<key column="ITEM_ID"> </key> 
<one-to-many class="hello.Bid" /> 
</set> </class> <sql-query name="selectAllItems" callable="true"> 
<return alias="i" class="hello.Item"> 
<return-property name="name" column="NAME" /> 
</return> 
{ call SELECT_ALL_ITEMS(?, :inId)} 
</sql-query> </hibernate-mapping> 
Bid.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.Bid" table="BID_PD_H">  
        
        <id name="id">  
            <column name="BID_ID" />  
            <generator class="sequence"> 
              <param name="sequence">SEQ_BID_PD_H </param> 
        </generator> 
        </id>  
        
        <property name="amountCurrency"> 
        <column name="AMOUNT_CURRENCY"> </column> 
        </property> 
        
        <many-to-one 
        name="item" 
        column="ITEM_ID" 
        class="hello.Item" 
        not-null="true"> 
        </many-to-one> 
        
        
        
    </class>  
    
</hibernate-mapping> 
三、主程序类文件 package hello; import java.util.Iterator; 
import java.util.List; import org.hibernate.Criteria; 
import org.hibernate.Hibernate; 
import org.hibernate.Query; 
import org.hibernate.Session; 
import org.hibernate.Transaction; 
import org.hibernate.criterion.Expression; 
import org.hibernate.criterion.Order; 
import org.hibernate.criterion.Restrictions; 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..............."); 
one.setStringDate("2009-11-09"); Bid oneBid = new Bid(100); 
Bid twoBid = new Bid(200); 
Bid threeBid = new Bid(300); 
Bid fourBid = new Bid(400); 
Bid fiveBid = new Bid(500); one.addBid(oneBid); 
one.addBid(twoBid); 
one.addBid(threeBid); 
one.addBid(fourBid); 
one.addBid(fiveBid); session.save(one); tx.commit(); 
session.close(); 
// 
// /** 
// * HQL查询 
// */ 
Session secondSession = HibernateUtil.getSessionFactory().openSession(); 
Transaction secondTransaction = secondSession.beginTransaction(); List <Item> itemList = secondSession.getNamedQuery("selectAllItems").setParameter("inId",71).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(); 

} 四、错误描述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:52)

解决方案 »

  1.   

    报错行数知道了,那还不去debug啊。代码太长,我没细看,给点小建议。1. 先确认存储过程取得的数据和它需要的参数是不是有为 null的。
    2. 取出后处理数据时,是不是有某些属性是null。而你没有事先判断。
      

  2.   

    secondSession.//确认这个是否null
    getNamedQuery("selectAllItems")//确认这个是否null
    .setParameter("inId",71).List <Item> itemList 是否null
      

  3.   

    secondSession为NULL吧你的session已经提交,回话完毕,你再打开,应该就空指针了
      

  4.   

    HibernateUtil.getSessionFactory()这个方法你怎么写的,在static{}块写的吗,如果没有呢,那你开了两次二级缓存,一个数据库只能开一次sessionFactory
    具体空指针可能发生在secondSession.getNamedQuery("selectAllItems")得到是空的,
      

  5.   


    代码太长了看看报错行数 debug下
    List <Item> itemList = secondSession.getNamedQuery("selectAllItems").setParameter("inId",71).list();你看看itemList取到值 了吗
      

  6.   


    测试了一下,到获取List的时候为null,之前没报错。