大家好,上次做了一个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)
表及存储过程: [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)
2. 取出后处理数据时,是不是有某些属性是null。而你没有事先判断。
getNamedQuery("selectAllItems")//确认这个是否null
.setParameter("inId",71).List <Item> itemList 是否null
具体空指针可能发生在secondSession.getNamedQuery("selectAllItems")得到是空的,
代码太长了看看报错行数 debug下
List <Item> itemList = secondSession.getNamedQuery("selectAllItems").setParameter("inId",71).list();你看看itemList取到值 了吗
测试了一下,到获取List的时候为null,之前没报错。