带有条件的 Grails 查询:如何取回带有列的地图?

Posted

技术标签:

【中文标题】带有条件的 Grails 查询:如何取回带有列的地图?【英文标题】:Grails queries with criteria: how to get back a map with column? 【发布时间】:2012-02-29 09:05:17 【问题描述】:

是否可以使用条件查询 grails 并接收地图列表而不是列表列表?我想在结果中包含列名,以便使用“关联数组”而不是数字数组偏移量。我目前正在做类似的事情

    def topFiveUsers = BlogEntry.createCriteria().list 
        projections 
            count('id')
            groupProperty('author')
        
        maxResults 5
    

这导致[[123, app.User:1][111, app.User:2][...]...],即列表列表。我宁愿想要像[[posts:123, author: app.User:1][posts: 111, author app.User:2][...]...] 这样的东西。

一如既往:非常感谢您的帮助!

【问题讨论】:

【参考方案1】:

使用resultTransformer()。 作为参数使用CriteriaSpecification.ALIAS_TO_ENTITY_MAP 关于这个主题的文档和示例很少。但这里有一个例子:

import org.hibernate.criterion.CriteriaSpecification

BlogEntry.withCriteria 
  maxResults 5
  resultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP)
  projections 
    count('id', 'total')
    groupProperty('author', 'author')
        
  

请注意,所有投影都需要别名。否则,生成的映射由空值组成。

【讨论】:

辉煌而优雅。非常感谢谢尔盖。 对我不起作用 :( groovy.lang.MissingMethodException: No signature of method: grails.gorm.CriteriaBuilder.resultTransformer() is applicable for argument types: (org.hibernate.transform.AliasToEntityMapResultTransformer) values: [org.hibernate.transform.AliasToEntityMapResultTransformer@7a78d380]【参考方案2】:
def topFiveList = []
topFiveUsers.each  rec ->
    topFiveList << [posts: rec[0], author: rec[1]]

【讨论】:

【参考方案3】:
def converted = topFiveUsers.collect [posts: it[0], author: it[1]] 

【讨论】:

感谢您的回复。当然,我可以稍后转换结果——这就是我目前正在做的事情。然后我想再次跳过对结果集进行后处理的开销。我猜想在休眠代码的某个地方,无论如何都会发生相同的转换...... 发布后不久,我突然想到您对两步解决方案不感兴趣。 别担心!无论如何感谢您的支持! se真是太棒了!

以上是关于带有条件的 Grails 查询:如何取回带有列的地图?的主要内容,如果未能解决你的问题,请参考以下文章

房间 - 选择带有 IN 条件的查询?

PostgreSQL:查询在带有变量的查询中没有结果数据的目的地

如何在 HTML 表格中显示带有分隔列的 SQL 查询结果

如何根据postgres的jsonb列的where条件(无本机查询)使用jpa在spring boot中选择数据?

在我的条件中搜索带有重音但没有重音的记录

绘制带有条件列的 pandas DataFrame