hibernate调用存储过程:
第一种不带参数的调用:
public List<MarkingTask> testList() {
// TODO Auto-generated method stub
Session s=null;
List<MarkingTask> listStudent=new ArrayList<MarkingTask>();
int i=1;
try {
s=getSession();
SQLQuery query = s.createSQLQuery("{Call test()}");//不带参数的调用很简单,但是要注意sql语句的写法,必须用“{}”包围起来
query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
List<Map> list = query.list();
if(list!=null&&list.size()!=0){
for (Map map : list)
{
System.out.println(map.get("TASKID"));
}
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(null != s){
CloseHelper.close(s);
}
}
return listStudent;
}
第二种:带参数的调用(这种方法要特别注意,参数的类型只能是IN,不能是OUT和INOUT,我在这里就是参数搞错了,郁闷死我了)
public List<MarkingTask> testList() {
// TODO Auto-generated method stub
Session s=null;
List<MarkingTask> listStudent=new ArrayList<MarkingTask>();
int i=1;
try {
s=getSession();
SQLQuery query = s.createSQLQuery("{Call test(?)}");//用占位符
query.setInteger(0, i);
query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
List<Map> list = query.list();
if(list!=null&&list.size()!=0){
for (Map map : list)
{
System.out.println(map.get("TASKID"));
}
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(null != s){
CloseHelper.close(s);
}
}
return listStudent;
}
------------------------------------------------------------------------------------------------------------------------------
值得注意的是如果存储过程里面涉及到事物的操作(增删改)的时候,必须在hibernate里面对过程声明事物,如果出现操作失败及时回滚,因为过程里面可能有多个涉及到事物的操作,可能是最后一个操作失败,所以我们必须如果有一个 操作失败那么所有的操作都必须回滚到原来的操作状态。
看个例子:
事物:
BEGIN
INSERT INTO eps_epub_task(TASKID,RES_PAPERID) VALUES(1,100);
UPDATE eps_epub_task1 SET RES_PAPERID=200 WHERE TASKID=1;//如果这一步操作失败,那么前面的insert语句插入的数据必须回滚
SELECT TASKID FROM eps_epub_task;
END
java代码:
@Override
public List<MarkingTask> testList() {
// TODO Auto-generated method stub
Session s=null;
Transaction t=null;//声明事物
List<MarkingTask> listStudent=new ArrayList<MarkingTask>();
int i=1;
try {
s=getSession();
t=beginTransaction(s);创建事物
SQLQuery query = s.createSQLQuery("{Call test(?)}");
query.setInteger(0, i);
query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
List<Map> list = query.list();
t.commit();//如果过程没问题则提交事物
if(list!=null&&list.size()!=0){
for (Map map : list)
{
System.out.println(map.get("TASKID"));
}
}
} catch (Exception e) {
t.rollback();//有异常则回滚
e.printStackTrace();
}finally{
if(null != s){
CloseHelper.close(s);
}
}
return listStudent;
}