Grails лучший способ перебрать все идентификаторы класса домена - PullRequest
13 голосов
/ 10 января 2012

У меня есть такой код:

Book.list().each {
  // real code actually does something more useful
  println "My id is " + it.id
}

Мне кажется немного бесполезной тратой того, что весь объект каждой Книги загружается только для доступа к идентификатору. В Grails есть метод load (), когда вы хотите работать только с идентификатором, и мне интересно, есть ли здесь эквивалент для загрузки всех экземпляров домена? Должен ли я использовать HQL? Или мне просто оставить все как есть?

PS: Меня интересует, должна ли быть опция, доступная большинству методов GORM (искатели и т. Д.), Которые заставляют его только «загружать» вместо «получать» целевой класс

Ответы [ 4 ]

9 голосов
/ 10 января 2012

Запрос критериев в сочетании с проекцией решает вашу проблему, когда вы хотите избежать использования HQL.

    def criteria = Book.createCriteria()
    def result = criteria.list {
        projections {
            property 'id'
        }
    }

В журнале Hibernate SQL показано, что из базы данных загружаются только идентификаторы, а не весьКниги: select this_.id as y0_ from book this_.

Запрос критерия также можно добавить как именованный запрос в классе домена Book, обеспечивая легкий доступ к списку идентификаторов.

8 голосов
/ 10 января 2012

Вы можете использовать hql, чтобы просто вернуть нужные поля

Book.executeQuery( "select b.id from Book b" );

5 голосов
/ 27 августа 2015

+ 1 Ответ @ Рубена, но вы можете сократить его до простого

def criteria = Book.withCriteria {
    projections {
        property 'id'
    }
}

и получить те же результаты!

0 голосов
/ 10 января 2012

Если объект Book не содержит много данных, я бы просто использовал Book.list для простоты.

Помните, что load () на самом деле не попадает в базу данныхон просто создает объект с установленным идентификатором.

...