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

Grails是迭代域类的所有ID的最佳方法,grails,gorm,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方法(查找

我有这样的代码:

Book.list().each {
  // real code actually does something more useful
  println "My id is " + it.id
}
加载每本书的整个对象只是为了访问id,这让我觉得有点浪费。Grails中有一个load()方法,当您只想对id进行操作时,我想知道这里是否有用于加载所有域实例的等效方法?我应该使用HQL吗?还是我应该保持原样


PS:这让我想知道是否应该有一个选项可用于大多数GORM方法(查找器等),这会导致它只“加载”而不是“获取”目标类

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


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

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


Book.executeQuery(“从Book b中选择b.id”)

当您希望避免使用HQL时,结合投影的条件查询可以解决您的问题

    def criteria = Book.createCriteria()
    def result = criteria.list {
        projections {
            property 'id'
        }
    }
Hibernate SQL日志显示仅从数据库加载id,而不是从整个图书中加载:
从该图书中选择此id作为y0


还可以在Book domain类中将criteria查询添加为,以方便访问ID列表。

+1获取@Ruben的答案,但您可以将其缩短为

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

得到同样的结果

我刚刚尝试过加载,如果您尝试访问id以外的任何属性,它似乎会访问数据库。是的,这就是使用.load而不是new Book(id:2)的原因,它会创建一个代理对象,在访问时延迟加载该对象。我同意如果Book类没有大量数据(少于100k),请使用Book.list()可能还可以。@aldrin load不适用于需要超过id的情况。为了可读性,我认为使用
namedQueries
或criteria查询要比SQL好得多,尤其是在查询变得更复杂的情况下。