ibatis 动态列

这段时间公司让我出一个改良版的报表 其内容是显示每个顾客在问卷上的答案,列是问卷的题目,当然每个顾客填的问卷不一定是同一钟。肯定是多种问卷,因此生成这种报表的时候我们不能采用固定列的写法。理所应当的采用动态列的写法。其核心便是以下语句

SELECT
		GROUP_CONCAT( DISTINCT CONCAT( ' MAX(IF(XXX =\'', XXX, '\',
		(CASE WHEN XXX!= \'[填空题]\'THEN
		XXX ELSE
		XXX END), NULL)) AS
		\'',XXX,'\'' ) ORDER BY
		XXX )

拼凑出对应的列语句 在进行SQL注入到我们的报表的语句中。
这也是我的写法 当然我一开始是采用存储过程写的 也实现了相应的效果。在扔到对应环境测试中 发现了一个BUG 那便是 当我执行了一次查询后。仿佛SQL被固定了,每次进行查询都是同一条SQL在进行查询,因此会爆 cloumn not found 的错误。因为新的查询出来的并不会拥有上一次查的动态列。在我第一次采用存储过程中产生这种情况 理所应当的是认为是存储过程导致的问题。因而转型为普通SQL多次查库。进行效果实现 结果发现也会有同样的问题。然而在数据库中查询都是正常的,因而我开始怀疑起是否是IBATIS的某些配置未配置正确导致了我的动态SQL固化。在查询多方资料后发现 确实是有个配置 remapResults=“true” 开启这个配置后 完美的达到了我的需求实现。特此记录

<select id="reportAfterSaleCallbackDetail"
		resultClass="java.util.LinkedHashMap"  remapResults="true">

这里采用LinkedHashMap是为了保证字段的顺序正确 用以替换中文表头
remapResults:在这种查询结果列不确定(或是动态变化)的情况下,为保证查询结果的正确就需要设置remapResults=“true”,或者当查询结果只是一个动态变化的列时可用select s e l e c t r e s u l t f i e l d selectresultfield selectresultfield as resultfield 的形式来解决。

当设置remapResults为"true"时:
iBATIS会在每次查询的时候内省查询结果来设置元数据,来保证返回恰当的结果。这个属性会造成一定的性能损失,所以要谨慎使用,只在你需要的时候使用--查询列发生变化,直接的,或者隐含的,检索的表发生变化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值