You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Groovy中如何使用Sql的executeQuery方法?执行报错求助

嘿,这个问题我太熟了!你碰到的报错是因为groovy.sql.Sql类里的executeQuery方法被标记为protected——它只能在Sql类本身或者它的子类内部调用,外部代码直接访问肯定会被禁止。别急,我给你两个靠谱的解决方案,还能顺便优化你的代码~

为什么会报错?

简单说,Groovy的Sql类把executeQuery设为protected是为了封装底层JDBC的细节,鼓励你用它提供的更友好的公开方法来执行查询,而不是直接操作JDBC的ResultSet(虽然也支持,但有更省心的方式)。

解决方案1:用query()方法兼容你的原逻辑

如果你还是想保留操作ResultSet的习惯,可以用Sql公开的query()方法,它能安全地返回ResultSet,而且Groovy会帮你处理资源回收:

def sql = new Sql(rdbDsService.getDataSource())
try {
    // 用闭包方式调用query,Groovy自动管理ResultSet的关闭
    sql.query("select top 5 Id from MACHINES where (Total != Rightcount) order by FinishingTime") { ResultSet rs ->
        // 先初始化order数组,避免NullPointerException
        def order = new int[4]
        int count = 0
        while (rs.next()) {
            // 防止数组越界(如果查询结果超过4条的话)
            if (count < order.length) {
                // 直接用getInt获取整数,不用转字符串再解析,更高效安全
                order[count] = rs.getInt("Id")
                count++
            }
        }
        // 这里可以继续使用order数组做后续操作
    }
} finally {
    // 务必关闭Sql连接,避免资源泄漏
    sql.close()
}

解决方案2:用rows()方法(更符合Groovy风格,更简洁)

如果你不想直接操作ResultSet,推荐用rows()方法——它会直接返回一个List<GroovyRowResult>,每个元素都是类似Map的对象,访问字段超级方便,代码也更简洁:

def sql = new Sql(rdbDsService.getDataSource())
try {
    // 直接拿到查询结果列表
    def rows = sql.rows("select top 5 Id from MACHINES where (Total != Rightcount) order by FinishingTime")
    def order = new int[4]
    // 取前4条结果(因为order数组只有4个位置),遍历赋值
    rows.take(order.length).eachWithIndex { row, index ->
        order[index] = row.Id as int
    }
    // 后续使用order数组即可
} finally {
    sql.close()
}

额外小技巧:用with方法自动管理连接

Groovy里可以用with块来自动关闭Sql连接,不用手动写finally,更省心:

// with块结束后会自动关闭Sql连接,不用手动close
new Sql(rdbDsService.getDataSource()).with { sql ->
    def rows = sql.rows("select top 5 Id from MACHINES where (Total != Rightcount) order by FinishingTime")
    def order = new int[4]
    rows.take(order.length).eachWithIndex { row, index ->
        order[index] = row.Id as int
    }
    // 后续操作
}

内容的提问来源于stack exchange,提问作者user9630935

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:20:35