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

时间:2012-01-10 09:30:39

标签: grails gorm

我有这样的代码:

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

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

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

4 个答案:

答案 0 :(得分:9)

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

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

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

条件查询也可以在Book域类中添加为named query,从而可以轻松访问ID列表。

答案 1 :(得分:8)

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

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

答案 2 :(得分:5)

+1对于@Ruben的回答,但您可以将其简化为

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

并获得相同的结果!

答案 3 :(得分:-2)

除非Book对象包含大量数据,否则我会使用Book.list来保持简单。

请记住 load()实际上并没有命中数据库,只是构造了一个id为set的对象。