[Datatables] JPA 페이징 처리 예제

 

BoardRepository.java

public List<Board> findPage(int start, int total) {
        return em.createQuery("select b from Board b", Board.class)
                .setFirstResult(start)
                .setMaxResults(total)
                .getResultList();
    }

setFirstResult : 시작위치

setMaxResults : 출력개수

setFirstResult(10).setMaxResults(10)의 결과는 10번째부터 10개가 출력된다는 의미이다. 

 

BoardService.java

 public List<Board> findPage(int start, int total) {
        return boardRepository.findPage(start, total);
    }

 

 

BoardController.java

package com.kyhslam.controller;

import com.kyhslam.domain.Board;
import com.kyhslam.service.BoardService;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

@Controller
@RequiredArgsConstructor
@Slf4j
public class BoardController {

    private final BoardService boardService;

    @GetMapping("/index")
    public String main(Model model) {
        return "index";
    }

    @PostMapping("/search")
    @ResponseBody
    public DataTableDto search(DataTableDto dto, @RequestBody MultiValueMap<String,String> formData){
        log.info("search =============== ");
        int draw = Integer.parseInt(formData.get("draw").get(0));
        int start = Integer.parseInt(formData.get("start").get(0));
        int length = Integer.parseInt(formData.get("length").get(0));

        List<Board> all = boardService.findAll();
        log.info("draw :: " + draw);
        log.info("start :: " + start);
        log.info("length :: " + length);

        int total = all.size();
        List data = boardService.findPage(start, length);
        log.info(" -- " + data.size());
        dto.setDraw(draw);
        dto.setRecordsFiltered(total);
        dto.setRecordsTotal(total);
        dto.setData(data);

        log.info(" -- " + dto);

        return dto;
    }



    @Data
    static class DataTableDto {
        private int draw;
        private int recordsTotal;
        private int recordsFiltered;
        private List data;
    }
}

 

index.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Hello</title>
</head>

<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.2/css/bootstrap.css" rel="stylesheet">
<link href="https://cdn.datatables.net/1.10.24/css/dataTables.bootstrap4.min.csshttps://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.2/css/bootstrap.css" rel="stylesheet">
<link href="https://cdn.datatables.net/1.10.24/css/dataTables.bootstrap4.min.css" rel="stylesheet">

<!--
https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.2/css/bootstrap.css
https://cdn.datatables.net/1.10.24/css/dataTables.bootstrap4.min.csshttps://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.2/css/bootstrap.css
https://cdn.datatables.net/1.10.24/css/dataTables.bootstrap4.min.css
-->

<body>

<table id="example" class="table table-striped table-bordered" style="width:100%">
    <thead>
    <tr>
        <th>id</th>
        <th>content</th>
        <th>writer</th>
    </tr>
    </thead>
</table>
</body>

<script src="https://code.jquery.com/jquery-3.5.1.js"></script>
<script src="https://cdn.datatables.net/1.10.24/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/1.10.24/js/dataTables.bootstrap4.min.js"></script>
<script>
    $(document).ready(function() {
        //$('#example').DataTable();
        $("#example").DataTable({
            "serverSide": true,
            "processing": true,
            "ajax": {
                "url": "/search",
                "type": "POST",
                "dataSrc": function(res) {
                    var data = res.data;
                    return data;
                }
            },
            "columns" : [
                {"data": "id"},
                {"data": "content"},
                {"data": "writer"}
            ]

        });
    } );


</script>
</html>

댓글

Designed by JB FACTORY