从 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 为假。