当前位置:主页 > 查看内容

Mybatis的@Param()注解导致分页失效

发布时间:2021-06-18 00:00| 位朋友查看

简介:Param注解导致分页失效—分页拦截器 问题描述 原因解析 解决办法 问题描述 在使用mybatis分页时使用Param注解传入了两个对象分页失效查询出的总是全部的数据。 出现问题时分页策略为 分页拦截器实现的分页 【 错误写法 】 service写法 public Page Entity ge……

@Param注解导致分页失效—分页拦截器

问题描述

  • 在使用mybatis分页时,使用@Param注解传入了两个对象,分页失效,查询出的总是全部的数据。
  • 出现问题时,分页策略为:分页拦截器实现的分页

错误写法

  • service写法:
public Page<Entity> getByNidAndEntity(Page<Entity> page,String nid,Entity entity){
       entity.setPage(page);
       page.setList(dao.getByNidAndEntity(nid,entity));
       return page;
}
  • dao方法声明:
List<Entity> getByNidAndEntity(@Param("nid") String nid,@Param("entity")Entity entity);
  • mapper.xml中的sql:
<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}
</select>

原因解析

关键原因

  • 根源问题在于:在PaginationInterceptor中,分页对象Page被解析为null,导致的分页失效
  • 由于@Param会将参数封装到ParamMap中,而page对象在实体类entity中,导致convertParameter方法返回的page对象为null
    在这里插入图片描述

mybatis原码:@Param将参数封装到ParamMap

  • 跟踪源码进入:org.apache.ibatis.binding.MapperMethod.class
    在这里插入图片描述
  • 进入executeForMany方法:
    在这里插入图片描述
  • 进入convertArgsToSqlCommandParam方法,可以看到参数封装到ParamMap中:
    在这里插入图片描述

解决办法

  1. 不使用@Param注解:在传递多个参数(或是多个javaBean)时,可以使用一个包含page属性的实体类进行封装
  2. 使用@Param注解:根据需求修改BaseInterceptor类中的convertParameter方法,使得解析page对象不为null即可
;原文链接:https://blog.csdn.net/qq_42002006/article/details/114368309
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文


随机推荐