在Hibernate中调用存储过程 [英] Calling a Stored Procedure in Hibernate

查看:121
本文介绍了在Hibernate中调用存储过程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我昨天刚开始学习hibernate,而且相当有趣。我有一些麻烦调用存储过程作为一个SQL查询与休眠。我已附上来源和错误,请帮助我。感谢:)

 <?xml version =1.0?> 
<!DOCTYPE hibernate-mapping PUBLIC
- // Hibernate / Hibernate Mapping DTD 3.0 // EN
hibernate-mapping-3.0.dtd>
< hibernate-mapping>
< class name =示例table =example>
< id name =user_idcolumn =id>
< generator class =increment/>
< / id>
< property name =user_data>
< column name =data/>
< / property>
< / class>

<! - sql-query必须在课后 - >

< sql-query name =getRecordsSPcallable =true>
< return class =示例>
< return-property name =user_idcolumn =user_id>< / return-property>
< return-property name =user_datacolumn =user_data>< / return-property>
< / return>
{call getRecords}
< / sql-query>

< / hibernate-mapping>

这是java文件:::

  import java.util.Iterator; 
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
导入org.hibernate.cfg.Configuration;


public class SelectProc {


public static void main(String [] args){

Session session =空值;
// String query =select example.id,example.data from Example example;

try {

SessionFactory sessionFactory = new Configuration()。configure()。buildSessionFactory();
session = sessionFactory.openSession();

System.out.println(选择记录);
Query q = session.getNamedQuery(getRecordsSP);
// Query q = session.createSQLQuery(call getRecords,,Example.class);

System.out.print(完成);
List l = q.list(); (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();



$ b

错误是:::

$ p $ call $ get

18:错误:0,SQLState:S0022
18:33:41,347错误JDBCExceptionReporter:46 - 未找到列'id0_'。
18:33:41,348警告JDBCExceptionReporter:38 - SQL错误:0,SQLState:S0022
18:33:41,349错误JDBCExceptionReporter:46 - 找不到列'id0_'。
18:33:41,349错误JDBCExceptionReporter:38 - 无法执行本机SQL查询
java.sql.SQLException:找不到列'id0_'。
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)
在org.hibernate.type.NullableType.nullSafeGet(NullableType.java:62)
在org.hibernate.type.NullableType.nullSafeGet(NullableType.java:53)
在org.hibernate.loader。 Loader.getKeyFromResultSet(Loader.java:541)
在org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:233)
在org.hibernate.loader.Loader.doQuery(Loader.java: 337)
在org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:167)
at或g.hibernate.loader.Loader.doList(Loader.java:1201)org.hibernate.loader.Loader.list(Loader.java:1186)
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) (SelectProc.java:28)
org.hibernate.JDBCException:无法在org.hibernate.impl.SessionImpl.findBySQL上执行本机SQL查询
(SessionImpl.java: 2215)
在org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:85)
在SelectProc.main(SelectProc.java:28)
导致:java.sql.SQLException :找不到列'id0_'。
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)
在org.hibernate.type.NullableType.nullSafeGet(NullableType.java:62)
在org.hibernate.type.NullableType.nullSafeGet(NullableType.java:53)
在org.hibernate.loader。 Loader.getKeyFromResultSet(Loader.java:541)
在org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:233)
在org.hibernate.loader.Loader.doQuery(Loader.java: 337)
在org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:167)
at或g.hibernate.loader.Loader.doList(Loader.java:1201)org.hibernate.loader.Loader.list(Loader.java:1186)
org.hibernate.loader.SQLLoader
。 list(SQLLoader.java:121)
at org.hibernate.impl.SessionImpl.findBySQL(SessionImpl.java:2212)
... 2 more


解决方案

  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;
导入org.hibernate.cfg.Configuration;



public class SelectPP {


public static void main(String [] args){

会话会话=空;
// 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(选择记录);
// 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(完成);
// List l = q.list();

$ b $ // //(Iterator it = l.iterator(); it.hasNext();){
// Object row [] =(Object [])it 。下一个();

//示例row =(示例)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]);

$ b $ catch(Exception e){
e.printStackTrace();
}
finally {
session.flush();
session.close();



$ / code $ / pre
$ b $我基本上重新设计了输入,使用hibernate的getNamedQuery,但java.sql类,它的工作原理!!!


I just started learning hibernate last night and its rather fun. I am some trouble calling a stored procedure as a sql-query with hibernate. I have attached the source and the error, please help me. Thanks :)

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Example" table="example">
   <id name="user_id" column="id" >
   <generator class="increment"/>
  </id>
  <property name="user_data">
    <column name="data"/>
  </property>
 </class>

<!-- sql-query must be after class --> 

<sql-query name="getRecordsSP" callable="true" >
<return class="Example">
<return-property name="user_id" column="user_id"></return-property>
<return-property name="user_data" column="user_data"></return-property>
</return>
{call getRecords}
</sql-query>

</hibernate-mapping>

This is the java file :::

    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();

        }
    }
}

The error is:::

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

解决方案

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();
        }
    }
}

I basically redesign the input without using hibernate getNamedQuery, but the java.sql class and it worked!!!

这篇关于在Hibernate中调用存储过程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆