场景:MyBatis 物理分页,查询条件中需要用到foreach ,参数失效,查不到结果
分析:把java.sql的debug打开,sql语句正常,参数也正常。debug物理分页代码,setParameters时,boundSql.getAdditionalParameter(propertyName)获取值始终是null,没有拿到参数。但是BoundSql的metaParameters中可以看到相关的参数值。
解决方法:
BoundSql countBS = new BoundSql(configuration, sql, boundSql.getParameterMappings(), parameterObject);
Field metaParamsField = ReflectUtil.getFieldByFieldName(boundSql, "metaParameters");
if (metaParamsField != null) {
MetaObject mo = (MetaObject) ReflectUtil.getValueByFieldName(boundSql, "metaParameters");
ReflectUtil.setValueByFieldName(countBS, "metaParameters", mo);
}
setParameters(prepStat, configuration, countBS, parameterObject);
ReflectUtil 代码:
public class ReflectUtil {
/**
* 获取obj对象fieldName的Field
*
* @param obj
* @param fieldName
* @return
*/
public static Field getFieldByFieldName(Object obj, String fieldName) {
for (Class<?> superClass = obj.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()) {
try {
return superClass.getDeclaredField(fieldName);
} catch (NoSuchFieldException e) {
}
}
return null;
}
/**
* 获取obj对象fieldName的属性值
*
* @param obj
* @param fieldName
* @return
* @throws SecurityException
* @throws NoSuchFieldException
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/
public static Object getValueByFieldName(Object obj, String fieldName) throws SecurityException,
NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
Field field = getFieldByFieldName(obj, fieldName);
Object value = null;
if (field != null) {
if (field.isAccessible()) {
value = field.get(obj);
} else {
field.setAccessible(true);
value = field.get(obj);
field.setAccessible(false);
}
}
return value;
}
/**
* 设置obj对象fieldName的属性值
*
* @param obj
* @param fieldName
* @param value
* @throws SecurityException
* @throws NoSuchFieldException
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/
public static void setValueByFieldName(Object obj, String fieldName, Object value) throws SecurityException,
NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
Field field = getFieldByFieldName(obj, fieldName);
if (field.isAccessible()) {
field.set(obj, value);
} else {
field.setAccessible(true);
field.set(obj, value);
field.setAccessible(false);
}
}
}
相关推荐
mybatis分页插件,非入侵式,支持mysql,orcale,sqlserver,支持其他数据库拓展
spring+mybatis实现了物理分页的
实现的一个spring_mybatis的物理分页,支持数据库方言,采用拦截器方式,不用修改源码
Spring+Springmvc+Mybatis+Shiro+Mybatis物理分页整合,里面没有多的测试代码,自己测试,有问题可以留言,亲测可用,我已经用到我项目,关于里面的Mybatis的分页功能是网上某个哥们的。我加入了MSSQL的部分,分页...
自己写的一个mybatis物理分页插件,支持mysql,oracle,db2,ms sql server2005-2008和ms sql server2012, 由于sql server2005的分页比较独特, 暂时只支持单order by 的情况, 多个order by会报错 , mysql,oracle,db2完美...
本人博客中的代码Jsp+Servlet+MyBatis完成分页查询 http://blog.csdn.net/japanstudylang/article/details/51700874
<... PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <!-- value="mssql|oracle|mysql|db2" --> </configuration>
Mybatis通用分页插件
NULL 博文链接:https://wang-ping001.iteye.com/blog/1918031
Mybatis3的分页代码,有Mysql和Oracle数据的
Spring Boot集成MyBatis与分页插件
mybatis数据库分页Spring原生例子
MyBatis拦截器分页与动态修改SQL及其参数值 提取SQL Like 字段
Mybatis批量foreach merge into的用法,这是介绍Mybatis批量foreach merge into的用法的文档
利用自定义jstl标签,实现mybatis分页查询
在实际开发过程中,我们往往需要编写复杂的SQL语句,拼接稍有不注意就会导致错误,Mybatis给开发者提供了动态SQL,大大降低了拼接SQL导致的错误。 动态标签 if标签 if标签通常用那个胡where语句,update语句,insert...
mybatis的分页插件,方便进行分页zszszszszszszszszszs
06实现mybatis分页插件demo06实现mybatis分页插件demo06实现mybatis分页插件demo06实现mybatis分页插件demo06实现mybatis分页插件demo06实现mybatis分页插件demo06实现mybatis分页插件demo06实现mybatis分页插件demo...
MyBatis自动分页实现 不用自己写代码