【问题标题】:How to execute a sql stored procedure from Java Hibernate using Session Factory?如何使用会话工厂从 Java Hibernate 执行 sql 存储过程?
【发布时间】:2013-04-07 03:16:41
【问题描述】:

我无法使用会话工厂从 java hibernate 调用我的存储过程

我编写了一个 sql 过程,它接受 5 个参数并返回一个在 MS SQL studio 中运行良好的结果集

EXEC SlaGrid @appID=245,@fromYear=2012,@toYear=2013,@fromMon=1,@toMon=12   --- sql

EXEC SlaGrid @applID=:applID,@fromYear=:fromYear,@toYear=:toYear,@fromMon=:fromMon,@toMon=:toMon  --hibernate

我正在为上述查询设置参数

String queryString = "EXEC SlaGrid @applID=:applID,@fromYear=:fromYear,@toYear=:toYear,@fromMon=:fromMon,@toMon=:toMon"

Query query = sessionFactory.getCurrentSession().createSQLQuery(queryString);

//set query parameters here

query.list()    --- giving sql grammer exception

【问题讨论】:

    标签: java sql spring hibernate stored-procedures


    【解决方案1】:

    您可以在休眠会话中使用callable statement

    Connection con = getSessionFactory().getCurrentSession().connection();  
    
    /**
    * Amend to include your parameters and proc
    */          
    CallableStatement cs = con.prepareCall( "{ call myprocedure }");
    
    cs.execute();
    

    【讨论】:

    • 我们需要关闭 callablestatement 吗?还是 session 会负责关闭可调用语句?
    【解决方案2】:

    试试这个

    Query query = sessionFactory.getCurrentSession().createSQLQuery(
        "CALL SlaGrid(:appID, :fromYear, :toYear, :fromMon, :toMon)")
        .setParameter("appID", 245)
        .setParameter("fromYear", 2012)
        .setParameter("toYear", 2013)
        .setParameter("fromMon", 1)
        .setParameter("toMon", 12);
    

    【讨论】:

    • 我已经尝试过了..这个语法适用于 mysql 而不是 mssql
    【解决方案3】:

    创建一个 SessionFactory 并打开一个会话

    CallableStatement callableStatement = session.connection().prepareCall("call GetMarketDataCDS(?,?)");
    callableStatement.setString(1,"JPM");
    callableStatement.registerOutParameter(1, OracleTypes.CURSOR);
    callableStatement.execute();
    ResultSet resultSet=(ResultSet) callableStatement.getObject(1);
    

    我在这里使用 oracle,我的第一个参数是 IN 参数,第二个是 OUT,它只是返回多行的结果集。 然后在最后一行我们得到包含所有行的 ResultSet,然后您可以遍历这些行。

    【讨论】:

    • connection() 方法已被弃用,不是吗?
    • @Tony,使用session.doWork(...)
    【解决方案4】:

    我通过以下代码简单地解决了它...只需在CSV中传递参数。感谢您的帮助..

    String queryString = "SlaGrid 245,2012,2013,1,12"
    
    Query query = sessionFactory.getCurrentSession().createSQLQuery(queryString);
    
    query.list();
    

    完美运行 :)

    【讨论】:

    • 'query.list();'在 Hibernate 4 中对我不起作用,而是我使用了 'query.executeUpdate()'
    • 这是独立于数据库类型工作还是特定于 MySQL?
    猜你喜欢
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 2011-02-25
    • 2011-01-08
    • 2016-04-13
    • 2011-11-07
    • 1970-01-01
    相关资源
    最近更新 更多