[查询] Grails getLast为每个groupBy条目

时间:2011-09-13 13:30:09

标签: hibernate grails

查询:我想知道如何在Grails中获取域实体的最新条目。

问题域:

 class Parent {

    String name
    static hasMany = [children:Child]
}


class Child {

        String name
        Parent parent
        static belongsTo = [parent:Parent]

    }

数据模型 enter image description here

结果

我喜欢用id 4和7来记录

批评应该是“让我最后记录每个父母的姓名如'Rox%'

到目前为止我已经尝试了

SELECT
MAX(id)
FROM child
WHERE parent_id IN(SELECT
                     p.id
                   FROM parent AS p
                     JOIN child AS c
                       ON (c.parent_id = p.id
                           AND c.name LIKE 'Rox%'))
 GROUP BY parent_id 

提前感谢。

3 个答案:

答案 0 :(得分:0)

你的描述有点阴暗,但我认为这就是你想要的:

def idList = [1,4]
def c = Parent.createCriteria()
def result = c.list {
  'in'("id", idList)
  children {
    like("name","Rox%")
  }
  groupProperty("id")
}

编辑:

当我输入我的答案时,你改变了整个问题,改变了它以匹配。

最终编辑: 在已编辑的代码中向子项{}添加排序以获得所需的排序。

答案 1 :(得分:0)

           Parent.createCriteria().list(max:10,offset:0) {
                     'children' {
                                  like("name","Rox%")
                                  order("id","desc")
                                  groupProperty("id")
                                }


                     groupProperty("id")
              }

     Parent.createCriteria().list(max:10,offset:0) {

                          createAlias("children", "ac")
                          like("ac.name","Rox%")
                          order("ac.id","desc")
                          groupProperty("ac.id")

                     groupProperty("id")
              }

其中两个条件查询在连接的基础上彼此不同。进一步阅读标准中的连接 http://adhockery.blogspot.com/2009/06/querying-by-association-redux.html

答案 2 :(得分:0)

为此,您需要SQL window function。在Oracle中,这看起来像:

select max(id)
over(partition by parent_id, order by dateCreated)
from child
group by parent_id

在Hibernate / HQL中的单个查询中无法做到这一点。

(你也想获得#9的记录,对吗?)