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
相关产品推荐
相关产品推荐

