作者:语涵星空 | 来源:互联网 | 2023-07-08 16:53
原标题:Mybatis的@Param()注解导致分页失效
原创
问题描述
- 在使用mybatis分页时,使用@Param注解传入了两个对象,分页失效,查询出的总是全部的数据。
- 出现问题时,分页策略为:
分页拦截器实现的分页
【错误写法】
public Page<Entity> getByNidAndEntity(Page<Entity> page,String nid,Entity entity){
entity.setPage(page);
page.setList(dao.getByNidAndEntity(nid,entity));
return page;
}
List<Entity> getByNidAndEntwww.yii666.comity(@Param("nid") String nid,@Param("entity")Entity entity);
<select id="getByNidAndEntity" resultType="Entity">
select <include refid="entityColumns" />
from entity_table et left join other_table ot on et.id = ot.eid
where ot.nid = #{nid}
and et.name = #{entity.name} and et.remarks = #{entity.remarks}
selec文章来源地址40173.htmlt>
原因解析
【关键原因】
- 根源问题在于:在PaginationInterceptor中,分页对象Page被解析为null,导致的分页失效
- 由于@P文章来源地址40173.htmlaram会将参数封装到ParamMap中,而page对象在实体类entity中,导致convertParameter方法返回的page对象为null
【mybatis原码:@Param将参数封装到ParamMap】
- 跟踪源码进入:org.apache.ibatis.binding.MapperMethod.class
- 进入executeForMany方法:
- 进入convertArgsToSqlwww.yii666.comCommandParam方法,可以看到参数封装到ParamMap中:
解决办法
- 不使用@Param注解:在传递多个参数(或是多个javaBean)时,可以使用一个包含page属性的实体类进行封装
- 使用@Param注解:根据需求修改
BaseInterceptor
类中的convertParameter
方文章来源站点https://www.yii666.com/法,使得解析page
对象不为null即可
来源于:Mybatis的@Param()注解导致分页失效
原创