【问题标题】:Grails named query to select row based on the max value in multiple rowsGrails命名查询根据多行中的最大值选择行
【发布时间】:2014-03-18 17:07:55
【问题描述】:

我有一个 groovy 多选标签 (),我想在其中只显示一组行中具有 MAX 修订的行。这是一个用 SQL 完成的帖子:to select single row based on the max value in multiple rows?

如何用 groovy 编写代码?我应该创建一个命名查询吗?

提前致谢。

【问题讨论】:

    标签: grails groovy grails-orm grails-2.0 grails-controller


    【解决方案1】:

    有多种方法可以实现这一目标。这些包括命名查询、条件、分离条件甚至 HQL。这是可以得到所需内容的 namedQuery:

    static namedQueries = {
        maxRevision {
            eq 'revision', {
                projections {
                    max 'revision'
                }
            }
            //projections if needed
            projections {
                property 'name'
            }
        }
    }
    
    //controller
    AppInfo.maxRevision().list()
    

    使用分离的标准,它类似于:

    AppInfo.withCriteria {
        eq 'revision', {
            projections {
                max 'revision'
            }
        }
    
        projections {
            property 'name'
        }
    }
    

    使用 HQL:

    select ai from AppInfo as ai 
    where ai.revision = (
        select max(revision) from AppInfo
    )
    

    考虑到以下域类:

    class AppInfo {
        String name
        Integer revision 
    }
    

    更新
    以上将给出所有修订的最大值。如果您正在寻找每个组的最大值,那么您将不得不使用以下 HQL:

    AppInfo.executeQuery("""
                          select ai from AppInfo as ai 
                          where ai.revision in (
                              select max(a.revision) from AppInfo as a 
                              where a.name = ai.name
                          )
                        """)
    

    这也可以写成标准。

    【讨论】:

    • 谢谢@dmahapatro .. 我尝试了命名查询。但是,它只返回一行。我想在 AppInfo 中选择所有具有最高修订号的名称...
    • 谢谢..我有一个类似的 SQL 代码,但性能很差..@Jonathan Leffler 提供了一个更好的 SQL 解决方案,下面的链接...stackoverflow.com/questions/8723404/…
    • 我试图写最后一个查询并得到了这个(不工作,它给出了所有的记录)。任何解决此@dmahapatro 的指针? def join = AppInfo.list { groupProperty("name") max('revision') }
    猜你喜欢
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 2016-01-31
    相关资源
    最近更新 更多