[Query] Grails getLast запись для каждого groupBy - PullRequest
0 голосов
/ 13 сентября 2011

Запрос: Мне бы хотелось узнать, как можно получить последнюю запись доменной сущности в 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 голосов
/ 14 сентября 2011
           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

0 голосов
/ 14 сентября 2011

Для этого вам нужна оконная функция SQL .В Oracle это будет выглядеть так:

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

Нет способа сделать это в одном запросе в Hibernate / HQL.

(вы также хотели бы получить запись № 9,не так ли?)

0 голосов
/ 13 сентября 2011

Ваше описание немного теневое, но я думаю, что это то, что вы хотите:

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

Edit:

Вы изменили весь свой вопрос, пока я печатал ответ, изменили его, чтобы он соответствовал.

Окончательное редактирование: Добавьте сортировку потомкам {} в отредактированном коде, чтобы получить нужную сортировку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...