2014-09-06 58 views
0

我打電話我的Java EE代碼PostgreSQL的功能,但它不返回任何東西在那裏。(它在SQL查詢結果)在Java EE中的CallableStatement不返回從PostgreSQL函數什麼

public List<Integer> convertIdsToLats12(Integer src, Integer dest) { 
    List<Integer> ids = new ArrayList<Integer>(); 
    ResultSet resultSet = null; 
    try { 
     Context ctx = new InitialContext(); 
     DataSource source = (DataSource) ctx.lookup("java:/RoutingDS"); 
     Connection connection = source.getConnection(); 

     CallableStatement statement = connection 
       .prepareCall("{ ? = call pgr_astar(?, ?, ?, ?, ?) }"); 
     statement 
       .setString(
         2, 
         "SELECT gid AS id, source::integer, target::integer, length::double precision AS cost, x1, y1, x2, y2 FROM waysF"); 
     statement.setObject(3, src); 
     statement.setObject(4, dest); 
     statement.setBoolean(5, false); 
     statement.setBoolean(6, false); 
     statement.registerOutParameter(1, Types.OTHER); 

     System.out.println("*************AVANT"); 
     statement.execute(); 
     System.out.println("*************APRES"); 

     resultSet = (ResultSet) statement.getObject(1); 

     while (resultSet.next()) { 
      ids.add((Integer) resultSet.getObject(2)); 
     } 
     resultSet.close(); 
     statement.close(); 
    } catch (Exception e) { 
     // TODO: handle exception 
    } 
    return ids; 
} 

這是我的方法,它有什麼問題嗎?

+0

沒有'JEE'這樣的東西 - 我認爲你的意思是JavaEE?你究竟使用什麼 - 應用服務器/框架和版本,PostgreSQL版本,PgJDBC版本。另外,你看過PostgreSQL服務器錯誤日誌嗎? – 2014-09-07 10:47:14

回答

0

您的代碼嚴重錯誤 - 您有一個空的catch塊。永遠不要這樣做。永遠。它被稱爲「默默吞嚥」異常,是一種掩蓋錯誤的好方法,所以你看不到真正發生的事情。

刪除,並添加throws SQLException的方法聲明,或把一些代碼來記錄任何捕獲的異常,如:

} catch (SQLException e) { 
    logger.severe("Whoops, query failed" + e); 
} 

很有可能會告訴你什麼地方出了錯。 (顯然你應該寫出比這更好的錯誤消息,最好包括完整的異常堆棧跟蹤,查詢文本,參數等。這僅僅是一個基本的例子。)

無論如何你永遠不應該使用catch (Exception e)。根據需要捕獲特定的異常類型。這是不好的編程習慣,會導致你捕捉到你並不想要的例外。

+0

好,謝謝所有 現在我有「一個可調用語句被執行的參數無效」異常 – 2014-09-07 21:22:33

+0

@ KhaledSmiri奇。據我所知,參數計數與輸入參數相匹配。您使用的是哪種PgJDBC版本? (您應該始終在所有問題中提供您的PgJDBC版本和PostgreSQL版本)。另外,在'psql'中'\ df pgr_astar'的輸出是怎樣的? – 2014-09-08 01:19:02

+0

感謝所有人,我解決了這個問題:Query query = entitymanager.createnativeqyery(「My Query」); return query.getresultlist(); – 2014-09-08 20:51:42