2009-07-31 6 views
3

私はHQLを使用するリストメソッドを持っています。このクエリにページングパラメータとソートパラメータを追加するにはどうすればよいですか?Grails:カスタムHQLクエリにソートとページングを追加する

// Account.executeQuery(「アカウントAは異なるa.numberを選択します(0.5以降)名前付きパラメータとページネーションのparamsの地図を使ってa.branch =::枝のドキュメントから

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

"、[分岐: 'ロンドン'、最大:10、オフセット:5]);

+0

この回答ISN」を実行することができます完全に正しい。以下の回答状態と同様に、executeQueryを使用してソートや順序付けを行うことはできません。 http://jira.codehaus.org/browse/GRAILS-1200を参照してください。 –

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

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

多くのパラメータを持っているなら、ソートパラメータをチェックする良い方法は、次のようなものです: 'params.sort = new Customer() .domainClass.persistentProperties * .name.contains(params.sort)? params.sort: 'name'' – Cookalino

関連する問題