2

こんにちは、もう 1 つの退屈な質問に戻ってきました。

テーブルをページネーションしようとしています。テーブルには 12 人のユーザーがいます。これが私のコントローラー機能です

    def listDuplicates(params) {
       def result = User.getAllWithDuplicateIDs()
       def totalDupCount = result.size()

         /*sout for troubleshooting */  
        System.out.println("Duplicate:" + result.ID + " " + result.username)

       params.max = Math.min(params.max ? params.int('max') : 10, 100)
       return [resultList: result, totalDupCount: totalDupCount, params:params ]

}

これが私の見解です

        <div>
        <fieldset class="warningFieldSet">
            <h1 style="color: red" align="center">
                <g:message code="Duplicate IDs" />

            </h1>
            <p style="color: red; margin-left: 20px;">Duplicate IDs Found!</p>
                <table>
                    <thead>
                        <tr>

                            <g:sortableColumn property="Username" title="Username" />
                            <g:sortableColumn property="ID" title="ID" />
                            <g:sortableColumn property="Status" title="Status" />
                        </tr>
                    </thead>

                    <tbody>
                        <g:each in="${resultList}" status="i" var="resultDuplicate">
                            <tr class="${(i % 2) == 0 ? 'even' : 'odd'}">
                                <td>
                                    ${resultDuplicate.username}
                                </td>

                                <td style="color: red; font-weight: bold">
                                    ${resultDuplicate.id}
                                </td>

                                <td>
                                    ${resultDuplicate.accountStatus }

                            </tr>
                        </g:each>
                    </tbody>
                    <tfoot>
                        <g:if test="${totalDupCount >10 }">
                            <div class="paginateButtons">
                                <g:paginate action= "listDuplicates" total="${totalDupCount}" />
                            </div>
                        </g:if>
                    </tfoot>
                </table>

            </fieldset>

    </div>

重複する ID を見つけるためのドメイン関数

  static List<User> getAllWithDuplicateIDs() {

    findAll("FROM User WHERE id IN (SELECT id FROM User group by id having count(*) > 1) AND id != ''   ", [])

}

ボタンが表示されます。また、URL にはオフセットと最大値が表示されます。この表では、1 ページに 10 個、もう 1 ページに 2 個表示するのではなく、12 個すべてを表示するだけです。2 ページ番号が表示されるので、1 ページに 10 個しか表示されないことが想定されていることがわかります。テーブル自体でそれを行っていないだけです。パラメータの受け渡しなどに何らかの問題があると想定しています。

提案/意見/ヘルプは大歓迎です!

4

3 に答える 3

4

maxGrails のページネーションは、との 2 つのパラメーターに基づいていますoffsetmaxページ サイズをoffset決定し、現在のページの開始位置を決定します。コントローラーはこれらのパラメーターを受け取り、通常はデータベース クエリに渡します。grails によってドメイン オブジェクトに追加されたlistメソッドはこれらのパラメーターを処理し、ファインダー メソッドはqueryParams. 通常のパターンは、paramsオブジェクトを直接、listまたはqueryParamsパラメーターとしてファインダーに渡すことです。これは、指定されたオフセットから始まる、1 ページの長さの結果セットを返します。

あなたの例ではgetAllWithDuplicateIDs、これらのパラメーターを使用せずに呼び出しています。次のように、クエリを更新して取得します。

static List<User> getAllWithDuplicateIDs(params) {
    findAll("FROM User WHERE id IN (SELECT id FROM User group by id having count(*) > 1) AND id != ''   ", [], params)
}

または、次のような方法でメモリにページングします

results = results.drop(params.offset).take(params.max)

リスト全体がメモリに収まらないケースをより適切に処理できるため、クエリで直接ページングすることをお勧めします。

于 2013-05-08T16:25:58.543 に答える
2

max関数とoffset関数のパラメーターを次のように指定します

def result = User.getAllWithDuplicateIDs([max:params.max, offset:params.offset])

そして、それらをデータベースへのクエリで使用します。または、ここ
で回答の最大値とオフセットを使用してリストから結果を取得する方法の回答を確認してください

于 2013-05-08T16:22:42.320 に答える