mybatis 大BUG

*宋清歌 2020-01-16 04:53:06


sql片段里的字段用as转换后,对应不到resultmap的column值,按理说应该获取不到数据才对,但是如图所示它无情的获取到了数据

有高手可知为何?

ps:已清过缓存,已重启过项目,已重启过电脑,另,用其他两个项目如此操作结果是获取不到数据,属于正常现象。
...全文
817 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
*宋清歌 2020-01-20
  • 打赏
  • 举报
回复
引用 17 楼 法灬九罪 的回复:
使用了 as 后的column名称 与映射Map 中的属性名一致; Mybatis 会自动在resultMap中没有匹配到column 根据名称匹配的; 参考4 楼的文档; 实际Mybatis 在使用中是有 DefaultResultSetHandler 的getRowValue方法中根据该配置,自动映射的

if (shouldApplyAutomaticMappings(resultMap, false)) {
        foundValues = applyAutomaticMappings(rsw, resultMap, metaObject, null) || foundValues;
      }
shouldApplyAutomaticMappings 就是根据resultMap配置的autoMapping 或 配置中的autoMappingBehavior 字段,执行是否自动映射; 说白了自动映射也就是根据column名称在类中找对应的属性

private boolean shouldApplyAutomaticMappings(ResultMap resultMap, boolean isNested) {
    if (resultMap.getAutoMapping() != null) {
      return resultMap.getAutoMapping();
    } else {
      if (isNested) {
        return AutoMappingBehavior.FULL == configuration.getAutoMappingBehavior();
      } else {
        return AutoMappingBehavior.NONE != configuration.getAutoMappingBehavior();
      }
    }
  }
不好意思,你说了这么多,语句也不通顺,通过你最后一句“执行是否自动映射; 说白了自动映射也就是根据column名称在类中找对应的属性”是想表达它是如何自动映射的?有点跑题了
*宋清歌 2020-01-19
  • 打赏
  • 举报
回复
其实这个问题,不算什么问题,如果我要是用了sql片段,里边还进行了as转换的话,就直接返回resultType了,此贴是偶然发现的这么个问题,遂来请教一下高手
*宋清歌 2020-01-19
  • 打赏
  • 举报
回复
引用 18 楼 LoranMEI 的回复:
告诉你,没有任何问题,mybatis自动映射列字段和属性了,如果不想用那个值,你不select它不就好了,或者as成其他的字段
不是想不想用那个值的问题呀,重点是这么搞按照mybatis的底层实现来讲根本不应该能够获取到值才对
*宋清歌 2020-01-19
  • 打赏
  • 举报
回复
CSDN什么破设置,只能回复三次。@六楼@你说小KS 原来你管这个叫强映射,我们习惯叫是否自动映射,但是此贴重点是select的字段都对应不上column,这个前提都不成立,更谈不上映射了,但是我也试了下,如果as转换的字段也不能跟property匹配是赋不上值的,但是不敢轻易下结论说:对应不上column能对应上property也能获取到数据。
引用 15 楼 Mister_X 的回复:
selectBill 中的查询语句换为select *试一下,不使用那个include
试过了一样,直接select 字段 as 也一样
niubility锐 2020-01-18
  • 打赏
  • 举报
回复
除了i开头的一段映射不到~其他字段可以映射吗?我怀疑是生成的set方法的问题,导致框架找不到对应set方法
编程写手 2020-01-17
  • 打赏
  • 举报
回复
as 转换后对应不到 cloumn的值,是不能被映射管理器获取到对应的属性的,这样是没有值的
编程写手 2020-01-17
  • 打赏
  • 举报
回复
首先你使用了映射关系,所以当前的mybatis会在获取到结果的时候按照当前的字段名称从映射注册器上面获取数据,它如果没有映射到就会尝试使用其他映射,如果找不到被映射的列就会报错的
情谊梦幻 2020-01-17
  • 打赏
  • 举报
回复
引用 楼主 *宋你 的回复:
sql片段里的字段用as转换后,对应不到resultmap的column值,按理说应该获取不到数据才对,但是如图所示它无情的获取到了数据 有高手可知为何? ps:已清过缓存,已重启过项目,已重启过电脑,另,用其他两个项目如此操作结果是获取不到数据,属于正常现象。
感觉你说的话有矛盾,as 转换后对应不到 cloumn的值,按道理应该能获取到的数据才对
编程写手 2020-01-17
  • 打赏
  • 举报
回复
大哥看一下这个官方的配置中,是可以设置强映射的
*宋清歌 2020-01-17
  • 打赏
  • 举报
回复
引用 2 楼 你是小KS 的回复:
这个应该是没有开启强映射的关系,开启了没有被映射的就不会显示,还有就是你的sql.可能存在问题
首先感谢回答,您说的强映射是mybatis的?特意去搜了一下并没有强弱的概念,其次这个sql没有问题,是最基本的单表查询,我也换过其他sql了只有select 连where条件都不加的那种。
LoranMEI 2020-01-17
  • 打赏
  • 举报
回复
告诉你,没有任何问题,mybatis自动映射列字段和属性了,如果不想用那个值,你不select它不就好了,或者as成其他的字段
编程写手 2020-01-17
  • 打赏
  • 举报
回复
这个应该是没有开启强映射的关系,开启了没有被映射的就不会显示,还有就是你的sql.可能存在问题
法灬九罪 2020-01-17
  • 打赏
  • 举报
回复
使用了 as 后的column名称 与映射Map 中的属性名一致; Mybatis 会自动在resultMap中没有匹配到column 根据名称匹配的; 参考4 楼的文档; 实际Mybatis 在使用中是有 DefaultResultSetHandler 的getRowValue方法中根据该配置,自动映射的

if (shouldApplyAutomaticMappings(resultMap, false)) {
        foundValues = applyAutomaticMappings(rsw, resultMap, metaObject, null) || foundValues;
      }
shouldApplyAutomaticMappings 就是根据resultMap配置的autoMapping 或 配置中的autoMappingBehavior 字段,执行是否自动映射; 说白了自动映射也就是根据column名称在类中找对应的属性

private boolean shouldApplyAutomaticMappings(ResultMap resultMap, boolean isNested) {
    if (resultMap.getAutoMapping() != null) {
      return resultMap.getAutoMapping();
    } else {
      if (isNested) {
        return AutoMappingBehavior.FULL == configuration.getAutoMappingBehavior();
      } else {
        return AutoMappingBehavior.NONE != configuration.getAutoMappingBehavior();
      }
    }
  }
plutoppppp 2020-01-17
  • 打赏
  • 举报
回复
你这个BUG,我们用起来感觉是福利,因为以前resultMap是必配的,现在因为这个特性,不用再写映射了
Mister_X 2020-01-17
  • 打赏
  • 举报
回复
selectBill 中的查询语句换为select *试一下,不使用那个include
cquzxs 2020-01-17
  • 打赏
  • 举报
回复
引用 13 楼 cquzxs 的回复:
在外层嵌套一个select,就取不到值了。 select a as ab 对应resultmap column a select * from (select a as ab) 对应resultmap column ab
说错了,请忽略
cquzxs 2020-01-17
  • 打赏
  • 举报
回复
在外层嵌套一个select,就取不到值了。 select a as ab 对应resultmap column a select * from (select a as ab) 对应resultmap column ab
liugc531 2020-01-17
  • 打赏
  • 举报
回复
引用 4 楼 你是小KS 的回复:
大哥看一下这个官方的配置中,是可以设置强映射的
CSDN什么破设置,只能回复三次。真垃圾,还得换个账号回复 原来你管这个叫强映射,我们习惯叫是否自动映射,但是此贴重点是select的字段都对应不上column,这个前提都不成立,更谈不上映射了,但是我也试了下,如果as转换的字段也不能跟property匹配是赋不上值的,但是不敢轻易下结论说:对应不上column能对应上property也能获取到数据。
*宋清歌 2020-01-17
  • 打赏
  • 举报
回复
引用 5 楼 情谊梦幻 的回复:
[quote=引用 楼主 *宋你 的回复:] sql片段里的字段用as转换后,对应不到resultmap的column值,按理说应该获取不到数据才对,但是如图所示它无情的获取到了数据 有高手可知为何? ps:已清过缓存,已重启过项目,已重启过电脑,另,用其他两个项目如此操作结果是获取不到数据,属于正常现象。
感觉你说的话有矛盾,as 转换后对应不到 cloumn的值,按道理应该能获取到的数据才对[/quote]。。。column对应不上就没法给property赋值,按理说是不应该赋上值的(我也另起两个项目试过了,都没获取到值,就这个项目,我以为多配置了什么,但是项目创建人都说没另外配置什么。。。)
*宋清歌 2020-01-17
  • 打赏
  • 举报
回复
引用 7 楼 你是小KS 的回复:
as 转换后对应不到 cloumn的值,是不能被映射管理器获取到对应的属性的,这样是没有值的
所以呀,截图是获取到值了呀,这就是此贴目的啊
加载更多回复(1)

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧