У меня есть приложение из учебника, оно использует 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 пытается