2017-07-27 15 views
2

私はこの問題を数時間解決しています.3つのテーブルがあり、そのうちの1つはプレース番号とトレイIDを介して他のテーブルを接続します。特定のトレイにいくつのサンプルがあるか調べるために、私は完全な純粋なSQLコードで動作するトレイIDで場所を集計しました。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

くそー...おかげさまで、次回の呼出しですでに3度目の首が壊れています。ちょうどそれを忘れて - @ – Philipp

答えて

0

結果セットにデータがあるかどうかを確認した後で、rs.getInt()を呼び出す前にカーソルをrs.next()で前方に移動していません。 。今、それはあなたが唯一のこれまでの1行まで含むように設定され、結果を期待しているようだとして、あなたが代わりに次のことが可能です。クエリは「didnの場合

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を返します。何もデータを返さない

+0

ありがとう!毎晩次のことについて忘れてください。そのようになっていないように働いている:) – Philipp

関連する問題