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

