Grails迭代域类的所有id的最佳方法

Fle*_*tch 13 grails grails-orm

我有这样的代码:

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

这让我觉得有点浪费,每本书的整个对象只是为了访问id而被加载.Grails中有一个load()方法,当你只想对ID进行操作时,我想知道这里是否有一个等价的加载所有域实例?我应该使用HQL吗?或者我应该保持原样?

PS:这让我想知道是否应该为大多数GORM方法(查找器等)提供一个选项,使其仅"加载"而不是"获取"目标类

Rub*_*ben 9

当您想要避免使用HQL时,标准查询与投影相结合可以解决您的问题.

    def criteria = Book.createCriteria()
    def result = criteria.list {
        projections {
            property 'id'
        }
    }
Run Code Online (Sandbox Code Playgroud)

Hibernate SQL日志记录显示只从数据库加载ID,而不是整个Books : select this_.id as y0_ from book this_.

条件查询也可以作为Book域类的命名查询添加,从而可以轻松访问ID列表.


Tom*_*Lin 8

您可以使用hql返回所需的字段

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


Dav*_*yer 5

+1 @ Ruben的答案,但你可以简单地缩短它

def criteria = Book.withCriteria {
    projections {
        property 'id'
    }
}
Run Code Online (Sandbox Code Playgroud)

并得到相同的结果!