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

