2009-07-31 139 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