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好得多,尤其是在查询变得更复杂的情况下。