在属性上使用投影时,结果将作为列表返回,其中元素的顺序与投影块中定义的顺序相同。同时,列表中缺少属性名称,这对开发人员来说确实是不利的,因为结果将被传递,并且调用者需要知道哪个值属于哪个属性。有没有办法从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查询结果的地图列表,而不是一个平淡无奇的列表。 / p>
答案 0 :(得分:8)
重复:Grails queries with criteria: how to get back a map with column?
以及相应的答案(和解决方案):https://stackoverflow.com/a/16409512/1263227
使用resultTransformer。
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)
}
答案 1 :(得分: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']]