大家好,上次做了一个Hibernate使用存储过程的示例,经过了一番研究之后,终于有了一点点进展,目前的状况是,存储过程已经能够访问到,也使用了OUT参数和IN参数,但是报出了一个空指针的错误,不知道哪里还有问题,请各位帮忙给看看。我将我的示例的完整代码列出:
表及存储过程:/* Set映射类型 */ drop table BID_PD_H;

create table BID_PD_H(
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(
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
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
minvalue 1
maxvalue 999999999999999999999999999
start with 71
increment by 1
cache 20;
commit;
DROP PROCEDURE selectAllItems;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.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();
}
}

解决方案 »

  1.   

    哦,Sorry,错误忘发了,补发一下哈:)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)
      

  2.   

    错误中的52行是主程序中的这一行:List <Item> itemList = secondSession.getNamedQuery("selectAllItems").setParameter("inId",71).list();