使用pageHelper分页插件对Oracle数据库分页出现数据重复

前言:工作中使用到了oracle数据库,需要使用pageHelper进行分页处理数据,处理完后发现第2页和第3页的数据内容相同。

下面贴出代码:

前端页面和controller就不展示了。

servcie层:

    public PageResult<DataSharingDyzjtz> getDataSharingDyzjtzNetinvest(DataSharingDyzjtz dataSharingDyzjtz, Pageable page) {
    	//先定一个变量存储数据总量
        long count;
        //调用pageHepler进行分页处理
        if (page != null && page.getPageNum() != null && page.getPageSize() != null) {
            PageHelper.startPage(page.getPageNum() + 1, page.getPageSize());
        }
        //调用自己写的多条件查询方法
        List<DataSharingDyzjtz> list = this.dataSharingDyzjtzDao.getDataSharingDyzjtzNetinvest(dataSharingDyzjtz);
        //将查询出的数据交给pageHelper
        PageInfo<DataSharingDyzjtz> info = new PageInfo<>(list);
        //获取数据总量用于在前端展示
        count = info.getTotal();
        //创建自定义的返回结果对象,将查询到的数据和数据总量一并返回。
        PageResult<DataSharingDyzjtz> pageResult = new PageResult<>(list, count, count);

        return pageResult;
    }

dao.xml

<select id="getDataSharingDyzjtzNetinvest" resultMap="resultMap">
		select
			ID,RPT_YEAR,CNY_C_NA,PROVINCENAME,V_VOC_C_NA,NETINVEST
		from
		    TABLE1
		<where>
			<if test="rptYear != null and rptYear !=''">
				and RPT_YEAR like '%' || #{rptYear,jdbcType=VARCHAR} || '%'
			</if>
			<if test="cnyCna != null and cnyCna !=''">
				and CNY_C_NA like '%' || #{cnyCna,jdbcType=VARCHAR} || '%'
			</if>
			<if test="provincename != null and provincename !=''">
				and PROVINCENAME like '%' || #{provincename,jdbcType=VARCHAR} || '%'
			</if>
			<if test="vVocCna != null and vVocCna !=''">
				and V_VOC_C_NA like '%' || #{vVocCna,jdbcType=VARCHAR} || '%'
			</if>
		</where>
		order by
			 to_number(RPT_YEAR) desc
	</select>

运行代码我们发现当我们点击第2页时和第3页时的内容一样。
为什么会出现这个问题呢?
研究后发现我们对RPT_YEAR字段进行了排序,但是RPT_YEAR字段在数据表中有很多一样的数据,所以我们不仅要对RPT_YEAR字段进行排序,还要加一个数据表中数据不重复的字段,比如主键ID

修改后的dao.xml

<select id="getDataSharingDyzjtzNetinvest" resultMap="resultMap">
		select
			ID,RPT_YEAR,CNY_C_NA,PROVINCENAME,V_VOC_C_NA,NETINVEST
		from
		    TABLE1
		<where>
			<if test="rptYear != null and rptYear !=''">
				and RPT_YEAR like '%' || #{rptYear,jdbcType=VARCHAR} || '%'
			</if>
			<if test="cnyCna != null and cnyCna !=''">
				and CNY_C_NA like '%' || #{cnyCna,jdbcType=VARCHAR} || '%'
			</if>
			<if test="provincename != null and provincename !=''">
				and PROVINCENAME like '%' || #{provincename,jdbcType=VARCHAR} || '%'
			</if>
			<if test="vVocCna != null and vVocCna !=''">
				and V_VOC_C_NA like '%' || #{vVocCna,jdbcType=VARCHAR} || '%'
			</if>
		</where>
		order by
			 to_number(RPT_YEAR) desc,
			 ID asc
	</select>

经过试验发现,我们给主键也加上排序之后,查询出来的数据在分页时就不会重复了。

总结:
在Oracle数据库中进行分页查询时,如果排序条件所对应的字段值有大量重复或为空时,则可能会出现分页数据重复的情况。如果要避免出现分页数据重复的情况,则一定要在排序时加上唯一值字段为排序条件。

Oracle PageHelper是一个分页插件,它可以帮助开发人员在使用Mybatis时方便地实现Oracle数据库分页功能。通过控制的打印的可以看出,PageHelper使用非常简便,只需要在查询方法之前调用PageHelper.startPage(int pageNum, int pageSize)方法来设置分页参数,然后进行查询操作即可。 例如,在使用PageHelper进行Oracle分页查询时,可以使用以下代码: ```java @Test public void Select() { PageHelper.startPage(3, 10); List<HnrbUser> list = hnrbAppInfosMapperl.queryUserByPgeHelper(); PageInfo<HnrbUser> a = new PageInfo<>(list); System.out.println(" a = " + a.toString()); System.out.println(a.getTotal()); for (HnrbUser s:a.getList()) { System.out.println("UserName" + s.getUserName()); } } ``` 在上述代码中,我们先调用PageHelper.startPage(3, 10)方法设置分页参数,表示查询第3页,每页显示10条记录。然后通过hnrbAppInfosMapperl.queryUserByPgeHelper()方法进行查询操作,并将结果存储在List<HnrbUser> list中。接下来,我们可以通过PageInfo对象a来获取分页相关的信息,如总记录数、总页数等。最后,我们可以通过a.getList()方法获取当前页的数据列表,并进行相应的操作。 需要注意的是,为了使用PageHelper插件,我们需要在对应的Mapper文件中编写查询语句,并将结果映射到相应的实体类中。在上述代码中,查询语句为: ```xml <select id="queryUserByPgeHelper" resultType="com.wisemax.hnrb.dto.HnrbUser"> select user_name as userName FROM COM_T_USER ORDER by user_name desc </select> ``` 该查询语句将COM_T_USER表中的user_name字段作为查询结果的userName属性,并按照user_name字段进行降序排序。请根据实际需求修改查询语句。 通过运行上述代码,控制台输出的内容将包含分页相关的信息和查询结果。请根据实际情况进行相应的处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [PageHelper实现Oracle分页的效率](https://blog.csdn.net/weixin_44592837/article/details/129307800)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [pagehelper插件-mybatis](https://download.csdn.net/download/qq_18142501/10588992)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [PageHelper5.0在oracle数据库使用](https://blog.csdn.net/gdsgdh308227363/article/details/83900486)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值