
过程如下:
public Boolean doInHibernate(Session session)
throws HibernateException, SQLException {
try{
Transaction tr = sessionbeginTransaction();
SQLQuery query = sessioncreateSQLQuery("{call CommandAdapter(,,,)}");
querysetString(0,"ls");
querysetInteger(1, machineid);
querysetString(2, param);
querysetInteger(3, 0); //
queryexecuteUpdate();
trcommit();
return true;
}catch(Exception e){
eprintStackTrace();
return false;
}finally{
sessionclose();
}
}
使用hibernate调用带参数返回值的存储过程方法
在调用带参数返回值的方法时,需使用到CallableStatement对象。因此,首先得设法获取一个Connection。
获取Connection 方法:
(1)sessionconnection();//此方法目前已被弃用
(2)SessionFactoryUtilsgetDataSource(sessionFactory)getConnection()
不
过我在使用SessionFactoryUtilsgetDataSource(sessionFactory)时,一直获取的都是空值,为此参考
SessionFactoryUtils的源代码直接利用ConnectionProvider对象来获取一个Connection实例。
完整代码:
SessionFactory sessionFactory=thisgetSessionFactory();
if (sessionFactory instanceof SessionFactoryImplementor){
ConnectionProvider cp = ((SessionFactoryImplementor) sessionFactory)getConnectionProvider();
try {
CallableStatement statement = cpgetConnection()prepareCall(
"{call MachineDataQuery(,,,,,,,,,,,,,)}");
statementsetInt(1, machineId);
statementsetInt(2, jobId);
statementsetInt(3, partTypeId);
statementsetInt(4, compentId);
statementsetInt(5, opId);
statementsetInt(6, roleId);
statementsetInt(7, userId);
statementsetString(8, sd);
statementsetString(9, ed);
statementregisterOutParameter(10, TypesFLOAT);
statementregisterOutParameter(11, TypesFLOAT);
statementregisterOutParameter(12, TypesFLOAT);
statementregisterOutParameter(13, TypesFLOAT);
statementregisterOutParameter(14, TypesFLOAT);
statementexecute();
Systemoutprintln(statementgetFloat(10));
Systemoutprintln(statementgetFloat(11));
Systemoutprintln(statementgetFloat(12));
Systemoutprintln(statementgetFloat(13));
Systemoutprintln(statementgetFloat(14));
} catch (SQLException e) {
eprintStackTrace();
}finally{
cpclose();
}
}
ps:切记存储过程中不可有多余的print或select语句,否则会抛出异常“commicrosoftsqlserverjdbcSQLServerException: 已生成用于更新的结果集。”
mapping映射配置了吗?实体类有没有实现序列化接口?并且如果您的hibernateSessionFactory不是自动生成的话也需要查看一下SessionFactory的代码。
将你需要 *** 作的那个对象所在的类进行单例化,就是私有化构造函数,不能创建对象,通过公共静态方法 得到内部已经创建好的对象,这样,不管从哪里得到的这个类的对象都是唯一的。
public class test {
private static test t = new test();
/
@param args
/
public static void main(String[] args) {
A a = new A();
B b = new B();
C c = CgetC();
Systemoutprintln(ca);
acaozuo(5);
Systemoutprintln(ca);
bcaozuo(10);
Systemoutprintln(ca);
}
}
class A{
C c=CgetC();
public void caozuo(int a)
{
ca=a;
}
}
class B{
C c = CgetC();
public void caozuo(int a)
{
ca=a;
}
}
class C{
int a=0;
private C(){};
private static C c = new C();
public static C getC()
{
return c;
}
}
如果使用Spring的话可以将sessionFactory交给Spring来管理
使用的时候直接用sessionFactorygetCurrentSession()方法来使用。
单独使用hibernate的话可以
SessionFactory sessionFactory=(SessionFactory) new Configuration()configure()buildSessionFactory();
Session session=sessionFactorygetCurrentSession();
以上就是关于hibernate中调用存储过程,如果返回了多个结果集,怎么处理全部的内容,包括:hibernate中调用存储过程,如果返回了多个结果集,怎么处理、怎样判断hibernate配置文件是否读取成功、sessionFactory是否创建成功、java中 多个类 *** 作同一个对象等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)