我有这样的代码:
Book.list().each {
// real code actually does something more useful
println "My id is " + it.id
}
让我觉得有点浪费,每本书的整个对象只是为了访问id而被加载。 Grails中有一个load()方法,当你只想对ID进行操作时,我想知道是否有一个等价的加载所有域实例?我应该使用HQL吗?或者我应该保持原样?
PS:这让我想知道是否应该为大多数GORM方法(查找器等)提供一个选项,使其仅“加载”而不是“获取”目标类答案 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的对象。