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

Grails中如何将SQL查询结果的数组数组转换为对象数组

解决Grails查询结果转对象数组的问题

你用Grails的executeQuery方法返回的是二维列表(每行是字段值的数组),要转成带键名的对象数组其实很简单,Groovy的集合操作就能轻松搞定,给你几种常用方案:

方案1:用collect直接映射成Map数组

这是最直接的方式,遍历每一行结果,手动把字段值对应到你想要的键名:

def data = cust.executeQuery("select custname, dept from customer")
// 转换格式
def formattedData = data.collect { row ->
    [Name: row[0], Dept: row[1]]
}
println("Data: ${formattedData}")

执行后输出就是你期望的:Data:[ {Name:X,Dept:Sales}, {Name:Y,Dept:Finance} ]

方案2:用Hibernate结果转换器直接返回Map

如果查询的字段比较多,不想手动写索引对应,可以给字段加别名,再用Hibernate的结果转换器直接生成Map:

def data = cust.executeQuery(
    "select custname as Name, dept as Dept from customer",
    [],
    [resultTransformer: org.hibernate.transform.AliasToEntityMapResultTransformer.INSTANCE]
)
println("Data: ${data}")

这种方式更健壮,不用担心字段顺序变化导致的索引错误,返回的直接就是键为别名的Map数组。

方案3:映射到自定义DTO类

如果需要更规范的对象(而不是Map),可以定义一个简单的DTO类,然后把结果映射过去:

// 先定义DTO类(可放在src/main/groovy目录下)
class CustomerDTO {
    String Name
    String Dept
}

// 查询并转换
def data = cust.executeQuery("select custname, dept from customer")
def formattedData = data.collect { row ->
    new CustomerDTO(Name: row[0], Dept: row[1])
}
println("Data: ${formattedData}")

这种方式适合后续需要对这些数据做更多业务操作的场景,类型更明确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:46:21