how can i implement a pagination in spring jdbcTemplate

后端 未结 4 1815
时光取名叫无心
时光取名叫无心 2021-01-13 23:22

here is my following dao implementaion

@Override
    public List getAddresses(int pageid,int total) {

        String sql = \"select * FRO         


        
相关标签:
4条回答
  • 2021-01-14 00:05

    I came across this while I was searching for something else, and noticed this has not been answered, so thought to post my 2cents. You can create a wrapper (Request) object containing Pagination object and pageId.

    Request

    • Pagination pagination
    • int pageId (any business related data/ SQL parameter)
    • ANY DOMAIN OBJECT

    Pagination

    • int start (Use to set OFFSET property in the SQL)
    • int size (Use to set the FETCH NEXT property in the SQL)
    0 讨论(0)
  • 2021-01-14 00:06

    This can be done as long as your database supports LIMIT and OFFSET.

    An example is given here. The critical code is shown below (you can ignore the fluent builder clauses):

    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.PageImpl;
    import org.springframework.data.domain.Pageable;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.stereotype.Repository;
    
    @Repository
    public class DemoRepository {
        private JdbcTemplate jdbcTemplate;
    
        @Autowired
        public DemoRepository(JdbcTemplate jdbcTemplate) {
            this.jdbcTemplate = jdbcTemplate;
        }
    
        public List<Demo> findDemo() {
            String querySql = "SELECT name, action, operator, operated_at " +
                    "FROM auditing " +
                    "WHERE module = ?";
            return jdbcTemplate.query(querySql, new Object[]{Module.ADMIN_OPERATOR.getModule()}, (rs, rowNum) ->
                    Demo.builder()
                            .rowNum(rowNum)
                            .operatedAt(rs.getTimestamp("operated_at").toLocalDateTime())
                            .operator(rs.getString("operator"))
                            .action(rs.getString("action"))
                            .name(rs.getString("name"))
                            .build()
            );
        }
    
        public Page<Demo> findDemoByPage(Pageable pageable) {
            String rowCountSql = "SELECT count(1) AS row_count " +
                    "FROM auditing " +
                    "WHERE module = ? ";
            int total =
                    jdbcTemplate.queryForObject(
                            rowCountSql,
                            new Object[]{Module.ADMIN_OPERATOR.getModule()}, (rs, rowNum) -> rs.getInt(1)
                    );
    
            String querySql = "SELECT name, action, operator, operated_at " +
                    "FROM auditing " +
                    "WHERE module = ? " +
                    "LIMIT " + pageable.getPageSize() + " " +
                    "OFFSET " + pageable.getOffset();
            List<Demo> demos = jdbcTemplate.query(
                    querySql,
                    new Object[]{Module.ADMIN_OPERATOR.getModule()}, (rs, rowNum) -> Demo.builder()
                            .rowNum(rowNum)
                            .operatedAt(rs.getTimestamp("operated_at").toLocalDateTime())
                            .operator(rs.getString("operator"))
                            .action(rs.getString("action"))
                            .name(rs.getString("name"))
                            .build()
            );
    
            return new PageImpl<>(demos, pageable, total);
        }
    }
    
    0 讨论(0)
  • 2021-01-14 00:08

    I agree with @Erica Kane for use of LIMIT and OFFSET.

    However, If Database is not supporting LIMIT and OFFSET then you can use ROW_NUMBER()

    for example -
    SELECT * FROM ( SELECT ROW_NUMBER() OVER(ORDER BY id) as RRN FROM user_addresses as T1 ) WHERE RRN between :start and :end; :start and :end you can give whatever number you wish to fetch result. 1 to 100 etc.
    If Total rows are less than end number then it will simply return whatever rows present.

    Some of the best link I found regarding ROW_NUMBER() with great explanation-

    https://blog.sqlauthority.com/2011/08/12/sql-server-tips-from-the-sql-joes-2-pros-development-series-ranking-functions-rank-dense_rank-and-row_number-day-12-of-35/

    https://blog.sqlauthority.com/2007/10/09/sql-server-2005-sample-example-of-ranking-functions-row_number-rank-dense_rank-ntile/

    https://blog.sqlauthority.com/2008/03/12/sql-server-2005-find-nth-highest-record-from-database-table-using-ranking-function-row_number/

    https://blog.sqlauthority.com/2015/09/03/sql-server-whats-the-difference-between-row_number-rank-and-dense_rank-notes-from-the-field-096/

    0 讨论(0)
  • 2021-01-14 00:09

    You don't have to create own implementation logic for pagination. Use Spring's PagedListHolder, it's suitable and configurable for pagination purposes.

    Here you can see an example implementation: Spring Pagination Example.

    0 讨论(0)
提交回复
热议问题