Ответ 1
Вы можете использовать hql, чтобы просто вернуть нужные вам поля
Book.executeQuery( "select b.id from Book b" );
У меня такой код:
Book.list().each {
// real code actually does something more useful
println "My id is " + it.id
}
Мне кажется, что это пустая трата, когда весь объект каждой Книги загружается только для доступа к id. В Grails существует метод load(), когда вы хотите работать только с ID, и мне интересно, существует ли здесь эквивалент для загрузки всех экземпляров домена? Должен ли я использовать HQL? Или я должен просто оставить его как есть?
PS: Мне интересно, должен ли быть доступ к большинству методов GORM (искатели и т.д.), которые заставляют его "загружать" вместо "получить" целевой класс
Вы можете использовать hql, чтобы просто вернуть нужные вам поля
Book.executeQuery( "select b.id from Book b" );
Критерии запроса в сочетании с проекцией решают вашу проблему, если вы хотите избежать использования HQL.
def criteria = Book.createCriteria()
def result = criteria.list {
projections {
property 'id'
}
}
Журнал регистрации Hibernate SQL показывает, что из базы данных загружаются только идентификаторы, а не все книги: select this_.id as y0_ from book this_
.
Запрос критериев также может быть добавлен как именованный запрос на класс книги Book, обеспечивая легкий доступ к списку идентификаторов.
+1 Для ответа @Ruben, но вы могли бы сократить его до простого
def criteria = Book.withCriteria {
projections {
property 'id'
}
}
и получите те же результаты!
Если объект Book не содержит большого количества данных, я бы просто пошел с Book.list, чтобы он был простым.
Помните, что load() фактически не попадает в базу данных, он просто создает объект с установленным идентификатором.