前言:工作中使用到了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数据库中进行分页查询时,如果排序条件所对应的字段值有大量重复或为空时,则可能会出现分页数据重复的情况。如果要避免出现分页数据重复的情况,则一定要在排序时加上唯一值字段为排序条件。