MyTableSqlProvider.java
问题描述:使用@SelectProvider注解,进行查询的时候报错
解决原因:
项目中使用了PageHelper 进行分页,与@SelectProvider这个注解不能一起使用
当我试图使用时,SqlProvider
我得到了一个例外org.apache.ibatis.reflection.ReflectionException
(说“ There is no getter for property named 'providerTakesParameterObject' in 'class org.apache.ibatis.builder.annotation.ProviderSqlSource'
”)。我用谷歌搜索它似乎SqlProvider
不能超过一个参数。这是演示代码
MyTableMapper.java
public interface MyTableMapper{
@SelectProvider(type=MyTableSqlProvider.class, method="selectSelective")
List<MyTable> selectSelective(Date from, Date to, String searchkey);
}
MyTableSqlProvider.java
public class MyTableSqlProvider{
public String selectSelective(Date from, Date to, String name) {
return new SQL() {{
SELECT("*");
FROM("MyTable");
if(from!=null){
WHERE("createtime >= {#from,jdbcType=TIMESTAMP}");
}
if(to!=null){
WHERE("createtime <= {#to,jdbcType=TIMESTAMP}");
}
if(!StringUtils.isBlank(name)){
WHERE("title like %{#name,jdbcType=VARCHAR}%");
}
}}.toString();
}
}
最后我找到了原因。这不是MyBatis
错误。我使用了Mybatis-PageHelper插件。旧版本的插件无法支持MyBatis 3.4.0
。我更新了插件,现在是正确的。
<!-- 新版本分页插件依赖 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.4</version> </dependency>
springboot 分页配置
/** * mybatis分页插件配置 */ @Configuration public class MyBatisConfig { @Bean public PageHelper pageHelper(){ PageHelper pageHelper = new PageHelper(); Properties p = new Properties(); // 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 p.setProperty("offsetAsPageNum","true"); //设置为true时,使用RowBounds分页会进行count查询 p.setProperty("rowBoundsWithCount","true"); p.setProperty("reasonable","true"); pageHelper.setProperties(p); return pageHelper; } }
但是我发现改用 最新版本的插件Mybatis-PageHelper ,分页插件失效 最后还是把插件改回老版本。
<!-- 分页插件依赖 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>4.1.0</version> </dependency>
解决方式:改用 xml 进行sql 查询
@SelectProvider和XML查询