2014-09-12 110 views
0

我有一個問題,使用Hibernate的Session調用存儲過程:如何調用存儲過程使用Hibernate con Sql Server 2000?

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 <Object []>

正確獲取數據錯誤:

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) 
+0

這可能是因爲Hibernate把一堆其他垃圾的命令之前,只當它是批處理中的第一條語句是允許在沒有EXECUTE的情況下執行的存儲過程。作爲第一步,請嘗試使用String queryString =「EXEC dbo.usp_Cierre_Dia _...'但肯定有一種方法可以將它作爲存儲過程發送,而不是查詢字符串。另外[請在創建或引用對象時始終使用模式前綴](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/11/bad-habits-to-kick-avoiding-the-schema-prefix.aspx)。 – 2014-09-12 19:28:46

回答

1

可以將存儲過程映射到一個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(); 
相關問題