Grails命名查询以根据多行中的最大值选择行

时间:2014-03-18 17:07:56

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

我有一个groovy多选标记(),我想在其中只显示一组行中包含MAX修订版的行。这是一篇用SQL编写的帖子:to select single row based on the max value in multiple rows

我怎么能用groovy写作?我应该创建一个命名查询吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

有多种方法可以实现这一目标。这些包括namedQueries,条件,分离标准甚至是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
                      )
                    """)

这也可以写成标准。