2012-11-19 75 views
6

我想在findAll查詢中整合排序,順序,最大值和偏移量。以下工作正常:Grails findAll具有排序,順序,最大和偏移量?

def books = Book.findAll("from Book as b where b.approved=true order by b.dateCreated desc", [max: max, offset: offset]) 

但我想要的是:

def books = Book.findAll("from Book as b where b.approved=true", [sort: 'dateCreated', order: 'desc', max: max, offset: offset]) 

這是行不通的。我該如何重寫這個?

回答

7

HQL不支持排序和順序作爲參數,所以你需要「按訂單」的HQL表達的一部分

def books = Book.findAll("from Book as b where b.approved=true" 
    + " order by b.dateCreated desc", [max: max, offset: offset]) 

(或在這種情況下,只需使用Book.findAllByApproved(true, [...])而不是HQL)以包括。

因此,如果排序和順序是變量,你需要像

def books = Book.findAll("from Book as b where b.approved=true" 
    + (params.sort ? " order by b.${params.sort} ${params.order}" : ''), 
    [max: max, offset: offset]) 
+0

這不回答這個問題。如何在此查詢中包含排序和順序作爲變量? – confile

+0

@userWebMobile請參閱編輯。 –

+0

你爲什麼要用:''? – confile

6

一招使用,其中查詢工作對我來說:

def books = Book.where{approved == true}.list(sort: 'dateCreated', order: 'desc', max: max, offset: offset)

或用直接從網頁PARAMS:

def books = Book.where{approved == true}.list(params)

0

使用「findAllBy」,因爲它支持排序和順序。

def results = Book.findAllByTitle("The Shining", 
      [max: 10, sort: "title", order: "desc", offset: 100]) 

點擊here瞭解詳情。

0

我假設您正在調用獲取控制器或服務類中的書籍列表。

如果您是通過控制器操作調用此函數,那麼魔術變量「params」已經可供您使用。 例如,如果您請求的頁面如下

book/list?max=10&offset=2 

然後「PARAMS」已經具有自動地映射這些值。

您可以添加更多的項目到PARAMS圖如下

params.sort = "dateCreated" 
params.order = "desc" 

一旦你建立你的PARAMS根據需要,那麼你可以使用Grails的動態查詢如下

def books = Book.findAllByApproved(true, params) 
// use "books" variable as you wish