在Hibernate中调用存储过程

我刚刚开始学习hibernate,它很有趣。 我使用hibernate将存储过程调用为sql-query时遇到了一些麻烦。 我附上了源码和错误,请帮帮我。 谢谢 :)

                 {call getRecords}   

这是java文件:::

  import java.util.Iterator; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class SelectProc { public static void main(String[] args) { Session session = null; //String query = "select example.id, example.data from Example example"; try{ SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); session = sessionFactory.openSession(); System.out.println("selecting records"); Query q = session.getNamedQuery("getRecordsSP"); // Query q = session.createSQLQuery("call getRecords","",Example.class); System.out.print("Done"); List l = q.list(); for(Iterator it = l.iterator() ;it.hasNext();){ Object row [] = (Object [])it.next(); System.out.println(row.length); // System.out.println(row[0]); // System.out.println("ID " + row[0]); // System.out.println("Data "+ row[1]); } } catch (Exception e) { e.printStackTrace(); } finally{ session.flush(); session.close(); } } } 

错误是:::

 call getRecords} 18:33:41,346 WARN JDBCExceptionReporter:38 - SQL Error: 0, SQLState: S0022 18:33:41,347 ERROR JDBCExceptionReporter:46 - Column 'id0_' not found. 18:33:41,348 WARN JDBCExceptionReporter:38 - SQL Error: 0, SQLState: S0022 18:33:41,349 ERROR JDBCExceptionReporter:46 - Column 'id0_' not found. 18:33:41,349 ERROR JDBCExceptionReporter:38 - Could not execute native SQL query java.sql.SQLException: Column 'id0_' not found. at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1075) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:929) at com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1144) at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2813) at org.hibernate.type.IntegerType.get(IntegerType.java:18) at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:62) at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:53) at org.hibernate.loader.Loader.getKeyFromResultSet(Loader.java:541) at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:233) at org.hibernate.loader.Loader.doQuery(Loader.java:337) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:167) at org.hibernate.loader.Loader.doList(Loader.java:1201) at org.hibernate.loader.Loader.list(Loader.java:1186) at org.hibernate.loader.SQLLoader.list(SQLLoader.java:121) at org.hibernate.impl.SessionImpl.findBySQL(SessionImpl.java:2212) at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:85) at SelectProc.main(SelectProc.java:28) org.hibernate.JDBCException: Could not execute native SQL query at org.hibernate.impl.SessionImpl.findBySQL(SessionImpl.java:2215) at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:85) at SelectProc.main(SelectProc.java:28) Caused by: java.sql.SQLException: Column 'id0_' not found. at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1075) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:929) at com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1144) at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2813) at org.hibernate.type.IntegerType.get(IntegerType.java:18) at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:62) at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:53) at org.hibernate.loader.Loader.getKeyFromResultSet(Loader.java:541) at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:233) at org.hibernate.loader.Loader.doQuery(Loader.java:337) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:167) at org.hibernate.loader.Loader.doList(Loader.java:1201) at org.hibernate.loader.Loader.list(Loader.java:1186) at org.hibernate.loader.SQLLoader.list(SQLLoader.java:121) at org.hibernate.impl.SessionImpl.findBySQL(SessionImpl.java:2212) ... 2 more 

根据文档,该过程必须返回一个结果集,并应该像这样调用:

 { ? = call procedureName() } 

所以请尝试以下方法:

      { ? = call getRecords }  

参考

  • Hibernate核心参考指南
    • 16.2.2。 使用存储过程进行查询
 import java.sql.CallableStatement; import java.sql.ResultSet; import java.util.Iterator; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class SelectPP { public static void main(String[] args) { Session session = null; //String query = "select example.id, example.data from Example example"; CallableStatement callableStatement = null; ResultSet resultSet = null; try{ SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); session = sessionFactory.openSession(); System.out.println("selecting records"); // Query q = session.getNamedQuery("getRecordsSP"); // Query q = session.createSQLQuery("call getRecords","",Example.class); // Query q = session.getNamedQuery("getRecordsSP"); callableStatement = session.connection().prepareCall("{call getRecords}"); callableStatement.execute(); resultSet = callableStatement.getResultSet(); while(resultSet.next()){ System.out.println(resultSet.getInt(1)); System.out.println(resultSet.getString(2)); } //resultSet. System.out.print("Done"); //List l = q.list(); // for(Iterator it = l.iterator() ;it.hasNext();){ // Object row [] = (Object []) it.next(); // Example row = (Example) it.next(); // System.out.println(row.getUser_id()); // System.out.println(row.getUser_data()); // System.out.println(row.length); // System.out.println("ID " + row[0]); // System.out.println("Data "+ row[1]); } catch (Exception e) { e.printStackTrace(); } finally{ session.flush(); session.close(); } } } 

我基本上重新设计输入而不使用hibernate getNamedQuery,但java.sql类和它工作!

您可以按照如何从hibernate会话获取jdbc连接的接受答案中的描述获得连接? 并针对它运行存储的函数/过程。