我已经坚持这个问题几个小时了:有3个桌子,其中一个桌子通过地点编号和托盘ID连接其他桌子。为了找出特定托盘上有多少样本,我按托盘ID聚合了这些位置,这在纯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 :(得分:0)
您的问题是,在检查结果集中是否有任何数据后,在调用rs.next()
之前,您没有使用rs.getInt()
向前移动光标。现在,您似乎只期望结果集最多包含一行,您可以执行以下操作:
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。