Как решить поведение, при котором jdb c не обновляет разбитый на страницы набор результатов? - PullRequest
0 голосов
/ 23 января 2020

У меня есть приложение из учебника, оно использует datatables и jpa. Мне удалось выполнить репликацию в формате jdb c, используя ResultSetExtractor вместо rowMapper (здесь описана моя первоначальная проблема Как реализовать обработку DataTables на стороне сервера с помощью JDB C, чтобы она разбивалась на страницы? ) Итак, предположим, весь мой набор состоит из 4 страниц и 18 записей, по 5 на страницу. Мой код успешно показывает, что общее число равно 18. но когда я нажимаю кнопку для go, чтобы перейти на следующую страницу, набор результатов все равно приносит мне первую страницу! Я проверил, какие данные отправляет, и он правильно отправляет поля начала и длины. Поэтому проблема в том, что массив, который я создаю с ResultSetExtractor, не обновляется. Мой новый репозиторий выглядит так:

@Repository
public class NewUserRepoImpl extends JdbcDaoSupport implements NewUserRepo {

    private static final String SELECT_ALL_SQL = "SELECT USER_ID as id, USER_NAME as name, SALARY as salary FROM MYUSERS";
    private static final String SELECT_USERMODEL = "SELECT USER_ID as id, USER_NAME as name, salary as salary, 1 as total_records FROM MYUSERS";

    private final NamedParameterJdbcTemplate namedParameterJdbcTemplate;
    private final JdbcTemplate jdbctemplate;

    public NewUserRepoImpl(NamedParameterJdbcTemplate namedParameterJdbcTemplate, JdbcTemplate jdbctemplate, DataSource dataSource) {
        this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;
        this.jdbctemplate = jdbctemplate;
        setDataSource(dataSource);
    }

    @Override
    public List<NewUser> findAll(PaginationCriteria pagination) {
        try {
            String paginatedQuery = AppUtil.buildPaginatedQueryForOracle(SELECT_ALL_SQL, pagination);
            System.out.println("Repo:");
            System.out.println(paginatedQuery);
            return jdbctemplate.query(paginatedQuery, new ResultSetExtractor<List<NewUser>>() {

                @Override
                public List<NewUser> extractData(ResultSet rs) throws SQLException, DataAccessException {
                    List<NewUser> list = new ArrayList<NewUser>();
                    ResultSetMetaData rsmd = rs.getMetaData();
                    int columnsNumber = rsmd.getColumnCount();
                    while (rs.next()) {
                        for (int i = 1; i <= columnsNumber; i++) {
                               if (i > 1) System.out.print(",  ");
                               String columnValue = rs.getString(i);
                               System.out.print(columnValue + " " + rsmd.getColumnName(i));
                           }
                           System.out.println("");
                        NewUser newUser = new NewUser();
                        newUser.setId(rs.getLong(1));
                        newUser.setName(rs.getString(2));
                        newUser.setSalary(rs.getString(3));
                        newUser.setTotalRecords(rs.getInt(4));
                        newUser.setRn(rs.getInt(5));
                        list.add(newUser);
                    }
                    return list;
                }});
        } catch (DataAccessException e) {
            throw new EntityNotFoundException("No Entities Found");
        }
    }

Мое сопоставление контроллера, где я храню jpa и jdb c, все еще для целей отладки:

    @RequestMapping(value="/users/paginated/orcl", method=RequestMethod.GET)
    @ResponseBody
    public String listUsersPaginatedForOracle(HttpServletRequest request, HttpServletResponse response, Model model) {

        DataTableRequest<User> dataTableInRQ = new DataTableRequest<User>(request);
        DataTableRequest<NewUser> dataTableInRQNew = new DataTableRequest<NewUser>(request);
        PaginationCriteria pagination = dataTableInRQ.getPaginationRequest();
        PaginationCriteria paginationNew = dataTableInRQNew.getPaginationRequest();
        String baseQuery = "SELECT USER_ID as id, USER_NAME as name, SALARY as salary FROM MYUSERS";
        String paginatedQuery = AppUtil.buildPaginatedQueryForOracle(baseQuery, pagination);
        String paginatedQueryNew = AppUtil.buildPaginatedQueryForOracle(baseQuery, paginationNew);

        Query query = entityManager.createNativeQuery(paginatedQuery, UserModel.class);

        @SuppressWarnings("unchecked")
        List<UserModel> userList = query.getResultList();

        List<NewUser> userListNew = newUserService.findAll(paginationNew);  
        System.out.println("1 " + new Gson().toJson(userList));
        System.out.println("2 " + new Gson().toJson(userListNew));

        DataTableResults<UserModel> dataTableResult = new DataTableResults<UserModel>();
        DataTableResults<NewUser> dataTableResultNew = new DataTableResults<NewUser>();
        dataTableResult.setDraw(dataTableInRQ.getDraw());
        dataTableResultNew.setDraw(dataTableInRQNew.getDraw());
        dataTableResult.setListOfDataObjects(userList);
        dataTableResultNew.setListOfDataObjects(userListNew);

        if (!AppUtil.isObjectEmpty(userList)) {
            dataTableResult.setRecordsTotal(userList.get(0).getTotalRecords()
                    .toString());
            if (dataTableInRQ.getPaginationRequest().isFilterByEmpty()) {
                dataTableResult.setRecordsFiltered(userList.get(0).getTotalRecords()
                        .toString());
            } else {
                dataTableResult.setRecordsFiltered(Integer.toString(userList.size()));
            }
        }
        if (!AppUtil.isObjectEmpty(userListNew)) {
            dataTableResultNew.setRecordsTotal(userListNew.get(0).getTotalRecords()
                    .toString());
            if (dataTableInRQ.getPaginationRequest().isFilterByEmpty()) {
                dataTableResultNew.setRecordsFiltered(userListNew.get(0).getTotalRecords()
                        .toString());
            } else {
                dataTableResultNew.setRecordsFiltered(Integer.toString(userListNew.size()));
            }
        }
        return new Gson().toJson(dataTableResultNew);
    }

Все с постфиксом или префиксом новый мой JDB c пытается

...