Подтвердить что ты не робот

Grails лучший способ перебора всех идентификаторов класса домена

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

Ответ 3

+1 Для ответа @Ruben, но вы могли бы сократить его до простого

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

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

Ответ 4

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

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