从 Java 中的结果集中检索聚合的 SQL 值
Retrieve an aggregated SQL value from a ResultSet in Java
我被这个问题困扰了几个小时:有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...() 函数中的每种数据类型:(
你的问题是你在检查结果集中是否有任何数据后,在调用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();
}
如果查询 return 没有任何数据,rs.next()
的第一次调用将 return 为假。
我被这个问题困扰了几个小时:有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...() 函数中的每种数据类型:(
你的问题是你在检查结果集中是否有任何数据后,在调用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();
}
如果查询 return 没有任何数据,rs.next()
的第一次调用将 return 为假。