如何使用 Hibernate con Sql Server 2000 调用存储过程?

Posted

技术标签:

【中文标题】如何使用 Hibernate con Sql Server 2000 调用存储过程?【英文标题】:How invoke a Store Procedure using Hibernate con Sql Server 2000? 【发布时间】:2014-09-12 19:20:52 【问题描述】:

我在使用休眠会话调用存储过程时遇到问题:

Java 代码:

@SuppressWarnings("unchecked")
@Transactional(readOnly = true)
@Override
public List<Map<String, Object>> buscarCierre(String vanio) throws Exception 
    try 
        List<Map<String, Object>> mapa = new ArrayList<>();
        String queryString = "usp_Cierre_Dia_Obtener_CierrePorAnio :anio, :pagActual, :tamanio";
        Query query = super.getSession().createSQLQuery(queryString);
        query.setString("anio", vanio);
        query.setInteger("pagActual", 1);
        query.setInteger("tamanio", 1);
        List<Object[]> result = query.list(); // requires casting for generics
        for(Object[] obj : result) 
            System.out.println("--- "+obj[0]);
            System.out.println("*** "+obj[1]);
        


        return mapa;
     catch (Exception e) 

        e.printStackTrace();

        throw new Exception( getGenerarError(Thread.currentThread().getStackTrace()[1].getMethodName(), 
                             Constantes.NIVEL_APP_DAO,
                             this.getClass().getName(),
                             e.getMessage()) );
     

它从 SQL Server 2000 调用,是这样的:usp_Cierre_Dia_Obtener_CierrePorAnio '2014',1,1

请帮助我,最后还要检查我是否通过List &lt;Object []&gt; 正确获取数据

错误:

Hibernate: usp_Cierre_Dia_Obtener_CierrePorAnio ?, ?, ?
WARN : org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 170, SQLState: 37000
ERROR: org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Line 1: Incorrect syntax near 'usp_Cierre_Dia_Obtener_CierrePorAnio'.
org.hibernate.exception.SQLGrammarException: could not extract ResultSet
    at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:122)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:61)

【问题讨论】:

这可能是因为 Hibernate 在您的命令之前发送了一堆其他废话,并且只有当它是批处理中的第一条语句时,才允许执行存储过程而无需执行。第一步,尝试String queryString = "EXEC dbo.usp_Cierre_Dia_...,但肯定有办法将其作为存储过程而不是查询字符串发送。还有please always use the schema prefix when creating or referencing objects. 【参考方案1】:

您使用的查询字符串不正确,因此 Hibernate 生成了无效命令,例如:Hibernate: usp_Cierre_Dia_Obtener_CierrePorAnio ?, ?, ?

参考Hibernate document了解如何使用休眠调用存储过程

SO 中还有其他示例展示了我们如何在 Hibernate 中调用存储过程,例如:

Can I call a stored procedure with hibernate criteria?

How can we call a stored procedure with Hibernate and JPA?

【讨论】:

【参考方案2】:

您可以将存储过程映射到 bean,并且不要忘记字符串参数周围的引号:

Query query = session.createSQLQuery("EXEC usp_Cierre_Dia_Obtener_CierrePorAnio :anio, :pagActual, :tamanio").addEntity(<MappedClass>.class);
query.setString("anio", "vanio");
query.setInteger("pagActual", 1);
query.setInteger("tamanio", 1);
List<MappedClass> list = query.list();

【讨论】:

以上是关于如何使用 Hibernate con Sql Server 2000 调用存储过程?的主要内容,如果未能解决你的问题,请参考以下文章

sql BIT / IAM-1881 - spListarAlumnosEvaluacion - Se agrega JOIN con Cat_EstatusAlumnos para filt

hibernate框架学习之使用SQLQuery查询数据

两个变量的最小值/最大值 Hibernate SQL

hibernate sql 语句 查询所有 字段名

如何将单行 R data.frame 插入 SQL Server 数据库?

Mysql数据库中FIND_IN_SET();在HIbernate中怎么使用。比如,如何传参;