在参数封装对象Page中使用in查询多项数据记录

来源:互联网 发布:华艺服装淘宝店 编辑:程序博客网 时间:2024/05/16 15:46

项目简介:SSM架构,后台将所有请求参数封装到Page对象中,直接传到底层,在mybatis的mapper.Xml文件中做分类处理。
问题描述:客户提出需求,在数据筛选条件中多个数据项支持多选操作,多选操作本身不难,但是导致查询异常。
传参数据结构:
{
teamid=”“,
yf=08,
bjDate=”“,
jjbh=”“,
sortOrder=”“,
pageSize=15,
jjbjlx=”06000099,05000003”,
jjbjxx=”“,
pageIndex=0,
jjbjxl=”“,
sortField=”“,
nd=”2017”,
jjrgh=”“,
jjbjlb=”06000000,05000000”,
xzqhdm=””
}
解决思路(在传参过程中参数始终会被框架转换成字符串或者数字,导致查询的时候异常):(由于我啥都不会,只能根据思路一个个瞎猜,各位看官见谅)

1、在controller层将请求数据进行拆分,拆分成数组传入mybatis配置文件中,在配置文件中使用<foreach>标签读取,报错Page对象中找不到getter方法。(该方法放弃)

2、直接在mybatis配置文件中使用page.param.jjbjlb.split(',')写入<foreach>标签的collection中,报错信息如下:
[2017-08-23 17:22:06,493] EGO_PERAPP :ERROR YwbJqJjjlbController:80 - 查询错误
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named ‘__frch_item_0’ in ‘class com.ego.util.Page’
(找不到处理方法,所以放弃)

3、使用@Param向<foreach>标签中传递参数(在原有的page参数基础上另外添加一个参数),报空指针异常。
[2017-08-23 17:40:56,136] EGO_PERAPP : INFO YwbJqJjjlbController:58 - 前台传递的参数【{teamid=, yf=08, bjDate=, jjbh=, sortOrder=, pageSize=15, jjbjlx=03000001,01010000,01020000, jjbjxx=0102000A,01020099,03000001, pageIndex=0, jjbjxl=03000001,01020099,0102000A, sortField=, nd=2017, jjrgh=, jjbjlb=01000000,02000000,03000000, xzqhdm=}】
[2017-08-23 17:40:56,143] EGO_PERAPP :DEBUG DataSourceUtils:110 - Fetching JDBC Connection from DataSource
[2017-08-23 17:40:56,144] EGO_PERAPP :DEBUG DriverManagerDataSource:162 - Creating new JDBC DriverManager Connection to [jdbc:oracle:thin:@localhost:1521:orcl]
[2017-08-23 17:40:56,199] EGO_PERAPP :DEBUG Connection:28 - ooo Connection Opened
[2017-08-23 17:40:56,276] EGO_PERAPP :DEBUG DataSourceUtils:332 - Returning JDBC Connection to DataSource
[2017-08-23 17:40:56,283] EGO_PERAPP :ERROR YwbJqJjjlbController:80 - 查询错误
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:

Error querying database. Cause: java.lang.NullPointerException
The error may exist in com/ego/khgl/mapper/YwbJqJjjlb.xml
The error may involve com.ego.khgl.mapper.YwbJqJjjlbMapper.findByConditionPage-Inline
The error occurred while setting parameters
Cause: java.lang.NullPointerException

4、后来下班路上试想是否可以使用数据库函数将传入参数进行一个处理,于是百度获得一帖,非常之经典,正好解决我的问题。
详情数据库函数请参考:
http://www.cnblogs.com/arxive/p/5959471.html
使用该函数后,原始代码基本不变,将配置文件中针对创建的函数进行调用即可。
案例(具体情况参考自己情况):

AND JJBJLB in (select nowStr from Table(GetSubStr(#{params.jjbjlb,jdbcType=VARCHAR},',')))

最终成功解决该问题。
感谢帖子中大神的分享。万谢。。

阅读全文
0 0
原创粉丝点击