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

Java 如何使用Hibernate con Sql Server 2000调用存储过程?,java,sql-server,spring,hibernate,Java,Sql Server,Spring,Hibernate,使用hibernate会话调用存储过程时出现问题: Java代码: @SuppressWarnings("unchecked") @Transactional(readOnly = true) @Override public List<Map<String, Object>> buscarCierre(String vanio) throws Exception { try { List<Map<String, Object>&

使用hibernate会话调用存储过程时出现问题:

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

您使用的查询字符串不正确,因此Hibernate生成了无效命令,如:
Hibernate:usp\u Cierre\u Dia\u Obtener\u CierrePorAnio?,?,?

请参阅以了解如何使用hibernate调用存储过程

中还有其他示例,说明了如何在Hibernate中调用存储过程,例如:


您可以将存储过程映射到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();
Query Query=session.createSQLQuery(“EXEC usp_Cierre_Dia_Obtener_CierrePorAnio:anio,:pagatual,:tamanio”).addEntity(.class);
查询设置字符串(“anio”、“vanio”);
query.setInteger(“pagActual”,1);
setInteger(“tamanio”,1);
List=query.List();

这可能是因为Hibernate在您的命令之前发送了一堆其他垃圾,并且只有当它是批处理中的第一条语句时,才允许在不执行EXECUTE的情况下执行存储过程。作为第一步,请尝试
String queryString=“EXEC dbo.usp\u Cierre\u Dia”
,但肯定有一种方法可以将其作为存储过程而不是queryString发送。另外。
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();