8

在属性上使用投影时,结果以列表的形式返回,其中元素的顺序与投影块中定义的顺序相同。同时,列表中缺少属性名称,这对开发人员来说确实是不利的,因为结果将被传递,调用者需要知道哪个值属于哪个属性。有没有办法从 Criteria 查询中返回一个映射,其中属性名称作为值的键?

所以,下面的代码:

def c = Trade.createCriteria()
def remicTrades = c.list {

    projections {
        property('title', 'title')
        property('author.name', 'author')
    }
    def now = new Date()
    between('publishedDate', now-365, now)
}

这将返回:

[['book1', 'author1']['book2', 'author2']]

相反,我希望它返回:

[[book:'book1', author:'author1'][book:'book2', author:'author2']]

我知道我可以在得到结果后以这种方式安排,但我真诚地认为标准应该使用属性别名来返回一个模仿 SQL 查询结果的映射列表,而不是一个平淡无奇的列表。

4

2 回答 2

8

重复:带有条件的 Grails 查询:如何取回带有列的地图?
以及相应的答案(和解决方案):https ://stackoverflow.com/a/16409512/1263227

使用结果转换器。

import org.hibernate.criterion.CriteriaSpecification

Trade.withCriteria {
  resultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP)
  projections {
    property('title', 'title')
    property('author.name', 'author')
  }
  def now = new Date()
  between('publishedDate', now-365, now)
}     
于 2013-05-07T00:59:04.607 回答
1

同意您的问题推理,这确实应该是核心 GORM 解决方案的一部分。也就是说,这是我的解决方法;

def props = ['name','phone']
def query = Person.where {}.projections {
        props.each{
                property(it)
        }

}
def people = query.list().collect{ row->
        def cols = [:]
        row.eachWithIndex{colVal, ind->
            cols[props[ind]] = colVal
        }
        cols
}
println people // shows [['name':'John','phone':'5551212'],['name':'Magdalena','phone':'5552423']]
于 2012-11-18T05:49:53.533 回答