从Java中的ResultSet中检索聚合的SQL值

时间:2017-07-27 21:37:10

标签: java sql resultset

我已经坚持这个问题几个小时了:有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 ...()函数中的每个数据类型:(

1 个答案:

答案 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。