【问题标题】:[Query]Grails getLast entry for each groupBy[查询]Grails getLast entry for each groupBy
【发布时间】:2011-09-13 13:30:09
【问题描述】:

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

问题域:

 class Parent {

    String name
    static hasMany = [children:Child]
}


class Child {

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

    }

数据模型

结果

我喜欢提取 id 为 4 和 7 的记录

critria 应该是“获取每个父母的最后一条记录,其中孩子的名字像 '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 

提前致谢。

【问题讨论】:

  • 什么是“最后一条记录”?这是基于什么?
  • 我用纯 sql 查询更新了问题。也许它有助于弄清楚我到底在寻找什么。谢谢
  • 您是否有任何理由使用id 来查找最新记录,而不是使用dateCreated 时间戳?前者似乎容易出错。
  • 如果您的建议有效,我可以免费使用 dateCreated !实际上,我需要为每个满足条件的父对象最后插入子对象

标签: hibernate grails


【解决方案1】:

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

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

编辑:

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

最终编辑: 在编辑后的代码中向子 {} 添加排序以获得您想要的排序。

【讨论】:

  • 谢谢它的工作。此外,我正在发布正确的答案以及您的进一步建议,例如“对儿童进行分类”
【解决方案2】:
           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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-19
      • 2011-08-02
      • 2012-11-22
      • 2019-10-11
      • 2013-09-09
      • 2011-07-21
      • 2021-08-12
      • 1970-01-01
      相关资源
      最近更新 更多