Hibernate规定了一些存储过程声明和调用方法,但是约束太多,需要调用任意的存储过程,例如,从一个表中查到存储过程名,然后调用它,所以需要直接使用JDBC API,参照hibernate中调用存储过程和hibernate中调用存储过程,调用
CallableStatement stmt = session.connection().prepareCall("{call procName}"); stmt.execute();
可以执行一个没有参数传递的存储过程。但是一直遇到Exception,如下:
com.mysql.jdbc.StringUtils.indexOfIgnoreCaseRespectQuotes(StringUtils.java:948) com.mysql.jdbc.DatabaseMetaData.getCallStmtParameterTypes(DatabaseMetaData.java:1256) com.mysql.jdbc.DatabaseMetaData.getProcedureColumns(DatabaseMetaData.java:3640) com.mysql.jdbc.CallableStatement.determineParameterTypes(CallableStatement.java:506) com.mysql.jdbc.CallableStatement.<init>(CallableStatement.java:401) com.mysql.jdbc.Connection.parseCallableStatement(Connection.java:4072) com.mysql.jdbc.Connection.prepareCall(Connection.java:4146) com.mysql.jdbc.Connection.prepareCall(Connection.java:4120) org.apache.commons.dbcp.DelegatingConnection.prepareCall(DelegatingConnection.java:275) org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.prepareCall(PoolingDataSource.java:292) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) java.lang.reflect.Method.invoke(Method.java:597) org.hibernate.jdbc.BorrowedConnectionProxy.invoke(BorrowedConnectionProxy.java:50) $Proxy9.prepareCall(Unknown Source)
查了无数资料,正在一筹莫展之际,看到文章linux下安装mysql,jdk,tomcat以及存储过程提到权限问题,才想起来我用root用户创建的存储过程,而用某普通用户调用之。终于解决了。