【问题标题】:Hibernate call sql server stored procedure throws Incorrect syntax near '@P0'Hibernate 调用 sql server 存储过程在“@P0”附近抛出不正确的语法
【发布时间】:2020-05-23 18:43:04
【问题描述】:

sql server 存储过程如下:

CREATE PROCEDURE SelectStaff @rankabbr varchar(14), @sex varchar(1)
AS
SELECT * FROM staff WHERE rankabbr = @rankabbr AND sex = @sex

我可以通过

在SSMS中成功运行它
exec SelectStaff  'AEO', 'M';

但是在eclipse中,我使用hibernate来调用这个存储过程如下:

Session session2 = HibernateUtil.getCurrentSession();
org.hibernate.Query query = session2.createSQLQuery(" call SelectStaff(:rankabbr, :sex) ")                    
          .setParameter("rankabbr","AEO")
          .setParameter("sex", "M");
List<Object[]> results =query.list();

但错误返回如下:

23:30:57,708 警告 [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (默认任务 7)SQL 错误:102,SQLState:S0001 23:30:57,741 错误 [org.hibernate.engine.jdbc.spi.SqlExceptionHelper](默认任务 7) '@P0' 附近的语法不正确。

是什么原因? 我试图在调用中添加 { } 为

org.hibernate.Query query = session2.createSQLQuery("{ call SelectStaff(:rankabbr, :sex) }")                      
                      .setParameter("rankabbr","AEO")
                      .setParameter("sex", "M");

但错误是一样的。

我尝试用 SQLServer2012Dialect 替换 SQLServerDialect 但同样的错误。

【问题讨论】:

  • 你用的是什么休眠版本?
  • 休眠核心 5.0.6

标签: java sql sql-server hibernate stored-procedures


【解决方案1】:

我发现以下代码有效:

Session session2 = HibernateUtil.getCurrentSession();
ProcedureCall call = session2.createStoredProcedureCall("SelectStaff");
call.registerParameter( 1, String.class, ParameterMode.IN).bindValue("AEO");
call.registerParameter( 2, String.class, ParameterMode.IN).bindValue("M");
Output output = call.getOutputs().getCurrent();
List<Object[]> results;
if (output.isResultSet()) {
     results = ( (ResultSetOutput) output ).getResultList();
     for (Object[] row:results) {
         // ......
     }
}

【讨论】:

    猜你喜欢
    • 2014-05-27
    • 2020-06-23
    • 2017-08-28
    • 2013-06-20
    • 2011-10-25
    • 2011-01-24
    • 2014-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多