2009-07-31 43 views
3

我有一個使用HQL的列表方法。如何將分頁和排序參數添加到此查詢中?Grails:將排序和分頁添加到自定義HQL查詢

def list = { 
     def termList 
     log.info "Getting terms for product: $params.productId" 
     params.max = 10 
     def p = Product.get(params.productId) 
     if (p) { 
      log.info "Product found: $p.name" 
      termList = Term.executeQuery("select distinct t from Term as t join t.definitions def join def.definitionProducts dp where dp.product=?", 
       p) 

     } else { 
      log.info "No Product found" 
      termList = Term.list(params) 

     } 
     log.info "Terms found: $termList.size" 

     [ termInstanceList: termList, termInstanceTotal: termList.size] 
    } 

回答

2

從文檔:

//使用與地圖命名參數和分頁則params的(自0.5) Account.executeQuery(「選擇從帳號鮮明a.number其中a.branch =:分支「,[分支:'倫敦',最大值:10,偏移量:5]);

+0

這個答案ISN」完全正確。像下面的答案狀態一樣,您不能使用executeQuery進行排序和排序。見http://jira.codehaus.org/browse/GRAILS-1200。 – 2009-10-05 05:37:56

7

我遇到了同樣的問題;雖然可以在executeQuery參數中指定max和offset,但排序和順序將被忽略。爲了實現這一點,我必須在HQL查詢本身中指定排序和順序。生成的查詢應該是這個樣子:

"select distinct a.number from Account a where a.branch = :branch order by a.id asc" 

首先,在排序的列,您需要更改的屬性屬性來引用您要查詢的域名。因此,對於「帳戶a」,請執行以下操作:

<g:sortableColumn property="a.id" title="Id"/> 

接下來,您需要更改HQL查詢。不幸的是,你似乎不能在order by子句中使用命名參數,所以你需要手動完成。首先清理params.order和params.sort可能是一個好主意。

"select distinct a.number from Account a where a.branch = :branch order by " + params.sort + " " params.order 

這對我有用,我真的希望有更好的辦法。

+0

在HQL中,我認爲你需要在查詢中特別包含order子句。我認爲使用通常的排序參數排序不起作用。應使用最大值和偏移量進行分頁。看例子http://grails.asia/grails-tutorial-for-beginners-hql-queries – JavaDev 2015-02-11 06:23:13

3

小心將未驗證的參數添加到SQL查詢中。

我做的驗證是這樣的:

params.sort = 
    params.sort in ['id','name'] ? params.sort:'name' 
params.order = 
    params.order in ['asc','desc'] ? params.order:'asc' 

然後我就可以放心地將參數添加到我的SQL查詢

String sql = """ 
    SELECT NEW MAP(c.id as id, c.name as name) FROM Customer c 
    WHERE c.partner.id = :id 
    ORDER BY c.$params.sort $params.order 
""".stripMargin() 

最後運行的executeQuery

def customers = Customer.executeQuery(
    sql, 
    [id:params.long('id')], 
    [max:params.long('max'),offset:params.long('offset')] 
) 
+1

如果你有很多參數,檢查sort參數的好方法是使用:`params.sort = new Customer() .domainClass.persistentProperties * .name.contains(params.sort)? params.sort:'name'` – Cookalino 2015-07-23 15:42:59