我们有一个动态sql,其中select子句和表名是变量。 以下是2个查询,而Integer 5是两个版本之间的差异。 注意:我们从头开始指定了remapResults = true。
SELECT Int1, Int2, Int3, Int4, Date1
FROM Table1
WHERE ...
SELECT Int1, Int2, Int3, Int4, Int5, Date1
FROM Table2
WHERE ...
代码在95%的时间内按预期执行,并且有时会抛出不可重现的异常。
异常1:net.sf.cglib.beans.BulkBeanException:java.util.Date无法强制转换为java.lang.Integer
异常2:net.sf.cglib.beans.BulkBeanException:java.lang.Integer无法强制转换为java.util.Date
请注意,参数图是一个类,结果也是一个类。
从日志中可以清楚地看出,ibatis没有正确遵守select查询中的字段,并且在日期为第4个元素而第5个整数甚至不存在的情况下,ibatis试图将日期映射到整数select子句。可能正在缓存结果模式。但是不是remapResults应该解决这个问题吗?并且它几乎总是起作用并导致随机异常,因此很难在问题上归零。
我们已经考虑了其他选项来摆脱动态sql,但想在转移到其他选项之前确定问题。
知道问题/修复可能是什么?我们应该使用remapResults和resultMap而不是resultClass吗?