java - Hibernate调用sql server存储过程在 '@P0'附近抛出错误语法

标签 java sql sql-server hibernate stored-procedures

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 WARN [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-7) SQL Error: 102, SQLState: S0001 23:30:57,741 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-7) Incorrect syntax near '@P0'.

这是什么原因呢? 我尝试在调用中添加 { } 作为

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

但是错误是一样的。

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

最佳答案

我发现以下代码有效:

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) {
         // ......
     }
}

关于java - Hibernate调用sql server存储过程在 '@P0'附近抛出错误语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60116662/

相关文章:

java - 如何使用 Java 访问安装在 Windows 上的驱动器?

sql - 删除表中的随机行,但保留固定数量的条目

mysql - 一个查询中一个表的 SQL 子组

sql-server - 直接从 SQL Server 获取 Azure ML 中的数据

java - 尝试将文件中的描述实现到游戏中

java - Hibernate 和 JPA 的好的继承策略是什么?

c# - 帮助将 sql 查询转换为 LINQ

sql - 从sql查询中的两列中减去值

java - 将文本附加到文件并同时将其内容打印到控制台?

php - 在mySQL中动态选择表