2017-07-27 71 views
2

我一直堅持這個問題幾個小時:有3個表,其中一個通過地點編號和托盤ID連接其他人。爲了找出特定托盤上有多少個樣本,我使用托盤ID彙總了這些地點,這在純SQL代碼中是完美的。從Java中的ResultSet中檢索聚合的SQL值

我的Java代碼:

ps = connection.prepareStatement("SELECT TRAYID, COUNT(PlaceNo) AS OCCUPIED " + 
               "FROM PLACE " + 
               "GROUP BY TRAYID " + 
               "HAVING TRAYID = ?"); 

     ps.setInt(1, trayId); 

     rs = ps.executeQuery(); 

     if (!rs.isBeforeFirst()) { throw new CoolingSystemException(); } 

     else { 

      spaceOccupied = rs.getInt("OCCUPIED"); 

隨着最後一行程序崩潰。我也試過getInt(1)而不是名字,但沒有任何作用。如果結果集是空的它會崩潰在

if (!rs.isBeforeFirst()) { throw new CoolingSystemException(); } 

我知道肯定是有,我確信它是這個地方,因爲我記錄的值

Image: DBeaver using the same TrayID

它在每一行之前和之後的每個可以想象的點。

有沒有人有一個想法如何解決它?我也嘗試了get ...()函數中的每一個數據類型:(

+0

有什麼例外 – rafaelim

+1

你不叫'rs.next()'anywh ERE。使用結果集的慣用方式是在while(rs.next())'循環中執行。 –

+0

該死的......非常感謝下次電話已經第三次打破我的脖子了。只是不要忘記它 - – Philipp

回答

0

你的問題是,在你檢查結果集中是否有任何數據後,在調用rs.getInt()之前,你沒有將光標向前移動rs.next()現在,因爲它似乎是你永遠只能期待結果集包含多達一排,你可以做以下代替:

ps = connection.prepareStatement("SELECT TRAYID, COUNT(PlaceNo) AS OCCUPIED " + 
              "FROM PLACE " + 
              "GROUP BY TRAYID " + 
              "HAVING TRAYID = ?"); 

ps.setInt(1, trayId); 
rs = ps.executeQuery(); 

if (rs.next()) { 
    spaceOccupied = rs.getInt("OCCUPIED"); 
} else { 
    throw new CoolingSystemException(); 
} 

rs.next()第一次調用將返回一個falsey如果查詢沒」 t返回任何數據

+0

非常感謝!每次都忘記這件事。不是它的工作像它應該是:) – Philipp