Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
grails使用1:m关系中的列表分页_Grails_Paginate - Fatal编程技术网

grails使用1:m关系中的列表分页

grails使用1:m关系中的列表分页,grails,paginate,Grails,Paginate,在下面的例子中,作者对象有一个现有的“书籍”列表。 如果控制器已经有了一个“author”对象,并且您不想再次请求返回数据库,那么如何对该图书列表进行分页 Book.findAll(“从作为b的书开始,其中b.author=:author”,[作者:author],[最大值:10,偏移量:5]) 我承认我是grails的新手——我想我一定错过了什么 因此,在经历了很多混乱之后,我的解决方案非常丑陋: def timeline = { println "timeline[" + params+ "

在下面的例子中,作者对象有一个现有的“书籍”列表。 如果控制器已经有了一个“author”对象,并且您不想再次请求返回数据库,那么如何对该图书列表进行分页 Book.findAll(“从作为b的书开始,其中b.author=:author”,[作者:author],[最大值:10,偏移量:5])


我承认我是grails的新手——我想我一定错过了什么

因此,在经历了很多混乱之后,我的解决方案非常丑陋:

def timeline = {
println "timeline[" + params+ "]"
if (params.id) {
  def author= Author.findByName(params.id) 

  def allbooks = author?.books as List

  def max=params.max?:(allbooks.size()>2 ? 2: allbooks.size())
  def offset=params.offset?:(0)

  offset = offset as int
  max = max as int

  def start = offset*max > allbooks.size()-1 ? allbooks.size()-1 : offset*max
  def end = ((offset*max)+max-1) > allbooks.size()-1 ? allbooks.size() -1 : ((offset*max)+max-1)

  def books= allbooks.size() > 0?allbooks[(start)..(end)]:allbooks

  def bookCount = allbooks.size()

  println "max:" + params.max + ""
  println "books.size:" + books.size() + ", bookCount:" + bookCount

  [author, bookCount, books]
  }
好久不见

我当然同意罗布的看法

您将在sql日志中看到,在这两种情况下,对作者和书籍进行了多个查询。Grails默认为延迟加载集合,语句也是如此

def author= Author.findByName(params.id)
你只载入了作者,没有载入书籍

添加一个额外的语句以正常的分页方式加载书籍将更高效,更易于维护,因为这样做更干净,更明显

这是我通常用来获取此类数据的方式

def timeline = {  
    println "timeline[" + params+ "]"  
    if (params.id) {  
    def author= Author.findByName(params.id)   
    def books = Book.withCriteria {  
      eq('author', author)  
      firstResult(5)  
      maxResults(10)  
    }  
    def totalBooks = Book.createCriteria().count {  
      eq(author, author)  
    }  

    ...  
}
另外,(对此不确定),但是books集合上的size()语句将触发count查询,但也可能触发其他查询,因此,当您有如此大的数据集来具体说明您让GORM做什么时,它是值得的


(根据下面的Bills评论更新)

只是好奇,必须进行DB查询有什么不对?分页的目的之一是鼓励使用额外的DB查询,以避免内存中存在大量数据。@Rob,@Aaron,原因有两个:'1'书籍列表已经存在,为什么我必须去重新获取它,'2'我将使用两种不同的方法获取相同的数据,这不是一个好主意,就像Rob说的那样,额外的查询很好,让GORM处理缓存和处理数据库问题,这就是为什么David要这样做。我确实需要eq(‘作者’,author)这行的引号。这显然比我的解决方案好。虽然我不能直接使用author.books,但这仍然让我感到不安
def timeline = {  
    println "timeline[" + params+ "]"  
    if (params.id) {  
    def author= Author.findByName(params.id)   
    def books = Book.withCriteria {  
      eq('author', author)  
      firstResult(5)  
      maxResults(10)  
    }  
    def totalBooks = Book.createCriteria().count {  
      eq(author, author)  
    }  

    ...  
}