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

Grails中如何为DetachedCriteria设置resultTransformer?

解决Grails 3.1中DetachedCriteria返回仅含id的实体对象列表问题

你可以通过以下几种方式实现需求:

方法一:获取底层Hibernate Criteria设置结果转换器

Grails的DetachedCriteria本身没有直接暴露setResultTransformer方法,但可以获取其底层的Hibernate Criteria对象来进行设置,结合投影和结果转换器生成仅含id的实体对象:

import org.hibernate.criterion.Projections
import org.hibernate.transform.Transformers

def criteria = new DetachedCriteria(SampleObject).build {
    // 这里添加你的查询条件(如果需要)
}

// 获取底层Hibernate Criteria
def hibernateCriteria = criteria.getHibernateCriteria()
// 设置投影只查询id
hibernateCriteria.setProjection(Projections.property("id"))
// 设置结果转换器,将结果映射为SampleObject实例
hibernateCriteria.setResultTransformer(Transformers.aliasToBean(SampleObject.class))

// 执行查询得到目标列表
def sampleObjectList = hibernateCriteria.list()

方法二:手动转换id列表为实体对象

如果场景简单,直接将查询到的id列表循环转换为SampleObject实例是最直观的方式:

// 查询得到id列表
def idList = new DetachedCriteria(SampleObject).build {}
                  .projections { property('id') }
                  .list() as List<Long>

// 转换为仅含id的SampleObject列表
def sampleObjectList = idList.collect { new SampleObject(id: it) }

注意事项

  • 方法一中需要确保SampleObject类有对应的构造方法或者setter方法,以支持结果转换器的属性映射;
  • 方法二的方式性能开销极低,适合不需要复杂查询逻辑的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 18:50:03