Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用JDBC实现数据表的服务器端处理,以便进行分页?_Java_Spring_Jdbc_Datatables_Server Side - Fatal编程技术网

Java 如何使用JDBC实现数据表的服务器端处理,以便进行分页?

Java 如何使用JDBC实现数据表的服务器端处理,以便进行分页?,java,spring,jdbc,datatables,server-side,Java,Spring,Jdbc,Datatables,Server Side,我有一个带有DataTables服务器端处理和Oracle数据库的Spring Boot应用程序。实际上,我是从实现其中一个教程开始的。成功了。本教程使用JPA。我想用JDBC实现同样的功能。我制作了所有相应的类,存储库,新模型,使用相同的fild,但没有jpa。但当我试图获取数据时,它只允许我获取第一页,而没有机会访问第二页。下面我将发布原始代码和添加代码的摘录。因此,原始教程使用了以下类: @Entity @Table(name = "MYUSERS") public class User

我有一个带有DataTables服务器端处理和Oracle数据库的Spring Boot应用程序。实际上,我是从实现其中一个教程开始的。成功了。本教程使用JPA。我想用JDBC实现同样的功能。我制作了所有相应的类,存储库,新模型,使用相同的fild,但没有jpa。但当我试图获取数据时,它只允许我获取第一页,而没有机会访问第二页。下面我将发布原始代码和添加代码的摘录。因此,原始教程使用了以下类:

@Entity
@Table(name = "MYUSERS")
public class User {

    @Id
    @Column(name = "USER_ID")
    private Long id;

    @Column(name = "USER_NAME")
    private String name;

    @Column(name = "SALARY")
    private String salary;

...getters and setters
}

我用一个这样的类替换了这两个类:

public class NewUser {

    private Long id;
    private String name;
    private String salary;
    private Integer totalRecords;
    private Integer rn;

...getters and setters
}
public interface UserRepository extends JpaRepository<User, Long> {

    @Query(value = "SELECT * FROM MYUSERS", nativeQuery = true)
    List<User> findAllByUsernames(List<String> listOfUsernames);
}
@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 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);
            return jdbctemplate.query(paginatedQuery, newUserRowMapper());
        } catch (DataAccessException e) {
            throw new EntityNotFoundException("No Entities Found");
        }
    }

    @Bean
    public RowMapper<NewUser> newUserRowMapper() {
        return (rs, i) -> {
            final NewUser newUser = new NewUser();
            newUser.setId(rs.getLong("ID"));
            newUser.setName(rs.getString("NAME"));
            newUser.setSalary(rs.getString("SALARY"));
            newUser.setTotalRecords(rs.getInt("TOTAL_RECORDS"));
            newUser.setTotalRecords(rs.getInt("RN"));
            return newUser;
        };
    }
}

表本身只有3个字段:id、name和salary,其他2个字段稍后创建和填充。 原始作者为用户提供的存储库如下所示:

public class NewUser {

    private Long id;
    private String name;
    private String salary;
    private Integer totalRecords;
    private Integer rn;

...getters and setters
}
public interface UserRepository extends JpaRepository<User, Long> {

    @Query(value = "SELECT * FROM MYUSERS", nativeQuery = true)
    List<User> findAllByUsernames(List<String> listOfUsernames);
}
@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 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);
            return jdbctemplate.query(paginatedQuery, newUserRowMapper());
        } catch (DataAccessException e) {
            throw new EntityNotFoundException("No Entities Found");
        }
    }

    @Bean
    public RowMapper<NewUser> newUserRowMapper() {
        return (rs, i) -> {
            final NewUser newUser = new NewUser();
            newUser.setId(rs.getLong("ID"));
            newUser.setName(rs.getString("NAME"));
            newUser.setSalary(rs.getString("SALARY"));
            newUser.setTotalRecords(rs.getInt("TOTAL_RECORDS"));
            newUser.setTotalRecords(rs.getInt("RN"));
            return newUser;
        };
    }
}

public interface UserRepository扩展了JpaRepository{
@查询(value=“SELECT*FROM MYUSERS”,nativeQuery=true)
列出findAllByUsernames(列出用户名称列表);
}
我自己的存储库如下所示:

public class NewUser {

    private Long id;
    private String name;
    private String salary;
    private Integer totalRecords;
    private Integer rn;

...getters and setters
}
public interface UserRepository extends JpaRepository<User, Long> {

    @Query(value = "SELECT * FROM MYUSERS", nativeQuery = true)
    List<User> findAllByUsernames(List<String> listOfUsernames);
}
@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 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);
            return jdbctemplate.query(paginatedQuery, newUserRowMapper());
        } catch (DataAccessException e) {
            throw new EntityNotFoundException("No Entities Found");
        }
    }

    @Bean
    public RowMapper<NewUser> newUserRowMapper() {
        return (rs, i) -> {
            final NewUser newUser = new NewUser();
            newUser.setId(rs.getLong("ID"));
            newUser.setName(rs.getString("NAME"));
            newUser.setSalary(rs.getString("SALARY"));
            newUser.setTotalRecords(rs.getInt("TOTAL_RECORDS"));
            newUser.setTotalRecords(rs.getInt("RN"));
            return newUser;
        };
    }
}

@存储库
公共类NewUserRepoImpl扩展JDBCDAO支持实现NewUserRepo{
private static final String SELECT_ALL_SQL=“SELECT USER_ID as ID,USER_NAME as NAME,SALARY as SALARY FROM MYUSERS”;
私有最终名称ParameterJDBCTemplate名称ParameterJDBCTemplate;
私有最终JdbcTemplate JdbcTemplate;
public NewUserRepoImpl(NamedParameterJdbcTemplate NamedParameterJdbcTemplate,JdbcTemplate JdbcTemplate,DataSource DataSource){
this.namedParameterJdbcTemplate=namedParameterJdbcTemplate;
this.jdbctemplate=jdbctemplate;
setDataSource(数据源);
}
@凌驾
公共列表findAll(分页标准分页){
试一试{
字符串paginatedQuery=AppUtil.buildPaginatedQueryForOracle(选择_ALL_SQL,分页);
返回jdbctemplate.query(paginatedQuery,newUserRowMapper());
}捕获(数据访问异常){
抛出新EntityNotFoundException(“未找到实体”);
}
}
@豆子
公共行映射器newUserRowMapper(){
返回(rs,i)->{
final NewUser NewUser=new NewUser();
newUser.setId(rs.getLong(“ID”);
newUser.setName(rs.getString(“NAME”);
newUser.setSalary(rs.getString(“SALARY”);
newUser.setTotalRecords(rs.getInt(“TOTAL_记录”);
newUser.setTotalRecords(rs.getInt(“RN”);
返回新用户;
};
}
}
buildPaginatedQueryForOracle东西转换我的查询,并允许它获取totalRecords和rn。在下面,我将为orifinal和我的查询发布它的输出(它们是相同的,我选中了)

那么,主要的部分,控制器。为了调试目的,我暂时将新旧部分放在其中,只返回其中一个结果:

@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);
        System.out.println(new Gson().toJson(dataTableInRQ));
        DataTableRequest<NewUser> dataTableInRQNew = new DataTableRequest<NewUser>(request);
        System.out.println(new Gson().toJson(dataTableInRQNew));
        PaginationCriteria pagination = dataTableInRQ.getPaginationRequest();
        System.out.println(new Gson().toJson(pagination));
        PaginationCriteria paginationNew = dataTableInRQNew.getPaginationRequest();
        System.out.println(new Gson().toJson(paginationNew));
        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);

        System.out.println(paginatedQuery);
        System.out.println(paginatedQueryNew);

        Query query = entityManager.createNativeQuery(paginatedQuery, UserModel.class);
        System.out.println("Query:");
        System.out.println(query);

        @SuppressWarnings("unchecked")
        List<UserModel> userList = query.getResultList();
        System.out.println(new Gson().toJson(userList));

        @SuppressWarnings("unchecked")
        List<NewUser> userListNew = newUserRepo.findAll(paginationNew);     
        System.out.println(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()));
            }
        }
        System.out.println(new Gson().toJson(dataTableResult));
        System.out.println(new Gson().toJson(dataTableResultNew));
        return new Gson().toJson(dataTableResult);
    }
@RequestMapping(value=“/users/paginated/orcl”,method=RequestMethod.GET)
@应答器
公共字符串listUsersPaginatedForOracle(HttpServletRequest请求,HttpServletResponse响应,模型){
DataTableRequest dataTableInRQ=新的DataTableRequest(请求);
System.out.println(新的Gson().toJson(dataTableInRQ));
DataTableRequest dataTableInRQNew=新DataTableRequest(请求);
System.out.println(new Gson().toJson(dataTableInRQNew));
PaginationCriteria pagination=dataTableInRQ.getPaginationRequest();
System.out.println(新的Gson().toJson(分页));
PaginationCriteria paginationNew=dataTableInRQNew.getPaginationRequest();
System.out.println(新的Gson().toJson(paginationNew));
String baseQuery=“从MYUSERS中选择用户ID作为ID,用户名称作为名称,薪资作为薪资”;
字符串paginatedQuery=AppUtil.buildPaginatedQueryForOracle(baseQuery,分页);
字符串paginatedQueryNew=AppUtil.buildpaginatedqueryforracle(baseQuery,paginationNew);
System.out.println(分页查询);
System.out.println(分页查询新建);
Query Query=entityManager.createNativeQuery(paginatedQuery,UserModel.class);
System.out.println(“查询:”);
System.out.println(查询);
@抑制警告(“未选中”)
List userList=query.getResultList();
System.out.println(新的Gson().toJson(userList));
@抑制警告(“未选中”)
List userListNew=newUserRepo.findAll(paginationNew);
System.out.println(new Gson().toJson(userListNew));
DataTableResults dataTableResult=新建DataTableResults();
DataTableResults dataTableResultNew=新建DataTableResults();
setDraw(dataTableInRQ.getDraw());
dataTableResultNew.setDraw(dataTableInRQNew.getDraw());
dataTableResult.setListOfDataObjects(userList);
dataTableResultNew.setListOfDataObjects(userListNew);
如果(!AppUtil.isObjectEmpty(userList)){
dataTableResult.setRecordsTotal(userList.get(0.getTotalRecords)()
.toString());
如果(dataTableInRQ.getPaginationRequest().isFilterByEmpty()){
dataTableResult.setRecordsFiltered(userList.get(0).getTotalRecords()
.toString());
}否则{
dataTableResult.setRecordsFiltered(Integer.toString(userList.size());
}
}
如果(!AppUtil.isObjectEmpty(userListNew)){
dataTableResultNew.setRecordsTotal(userListNew.get(0.getTotalRecords)()
.toString());
如果(dataTableInRQ.getPaginationRequest().isFilterByEmpty()){
dataTableResultNew.setRecordsFiltered(userListNew.get(0).getTotalRecords()
.toString());
}否则{
dataTableResultNew.setRecordsFiltered(Integer.toString(userListNew.size());
}
}
System.out.prin