安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

记一次MyBatisPlus中SelectOne踩坑一个数据

11月27日 渡缘祠投稿
  一、背景
  今天一个线上问题报错如下:
  org。apache。ibatis。exceptions。TooManyResultsException:
  Expectedoneresult(ornull)tobereturnedbyselectOne(),butfound:2
  通过报错信息可以知道这个是一个数据查询结果集不符的问题,程序中预期是只有一条数据的,但是查出来的结果有多个。
  二、问题排查
  先看数据:提取出来SQL语句执行发现真的是有2条符合记录
  那就是SQL语句的编写有问题,定位SQL语句产生的那一行代码
  发现使用了MyBatisPlus的LambdaQuery()查询中的one()方法
  PS:这里贴一下出错的代码行
  BHOrderCargoSizeEntitysplitCargoSize
  bhOrderCargoSizeService。lambdaQuery()。eq(BHOrderCargoSizeEntity::getSplitId,x。getId())。one();
  三、问题深究3。1、selectOne()第一印象
  可能对于多数人one()方法给人的第一印象是:取查询结果的其中一个然后返回3。2、真正的selectOne()
  既然都已经产生的错误那selectOne()的实际操作肯定不是和上面的想的一样的。我们点进去MP的源码可以看到如下:
  先点击去One()方法可以看到如下:这里是MyBatisPlus源码获取单个return单个defaultTone(){returngetBaseMapper()。selectOne(getWrapper());}
  Java
  这里可以看到是调用了selectOne()方法,同样我们在使用条件构造器进行查询时:日常项目中构造器查询代码示例OverridepublicUserEntityqueryByMobile(Stringmobile){returnbaseMapper。selectOne(newQueryWrapperUserEntity()。eq(mobile,mobile));}
  Java
  其中的selectOne()操作也是单条数据查询的。
  于是我们找到如下部分代码:这里是MyBatisPlus源码OverridepublicTgetOne(WrapperTqueryWrapper,booleanthrowEx){if(throwEx){returnbaseMapper。selectOne(queryWrapper);}returnSqlHelper。getObject(baseMapper。selectList(queryWrapper));}
  我们可以发现:
  。有异常抛给上层处理
  。正常情况下getOne()的操作是selectList()实现的
  当有多条数据时就有了如下的情况:这里是MyBatisPlus源码p从list中取第一条数据返回对应List中泛型的单个结果paramlistparamEreturnpublicstaticEEgetObject(ListElist){if(CollectionUtils。isNotEmpty(list)){intsizelist。size();if(size1){logger。warn(String。format(Warn:executeMethodTherearesresults。,size));}returnlist。get(0);}}
  通过上述表明:
  。当只有一条数据返回时程序才能正常执行
  。当数据返回多条时就会给出异常提示了
  四、问题解决
  直接使用MyBatisPlus的last方法在sql末尾追加语句limit1,代码如下:
  BHOrderCargoSizeEntitysplitCargoSize
  bhOrderCargoSizeService。lambdaQuery()。eq(BHOrderCargoSizeEntity::getSplitId,x。getId())。last(limit1)。one();
  网上有一些重写selectOne方法的,基本通过重写或切面编程。有兴趣可以了解下(不建议新手这样操作!)
  PS:关于MyBatisPlus的语法知识点也可以参考我之前的文章:
  初见MyBatisPlus
  五、后记
  遇到问题只知道怎么解决是不够的,能追其本质才是乐趣所在。
投诉 评论 转载

世链专访元宇宙NFT风口之下,NFB缘何引爆亿万蓝海从万物皆可NFT爆火出圈,到Metaverse元宇宙疯狂大热,Facebook的高调改名,微软的强势入局,无不说明着一点:元宇宙和NFT作为当代最强风口,无异于是一把打开区块链……蓝牙耳机怎么选?以诺基亚蓝牙耳机为例四招即可破解蓝牙耳机怎么选?以诺基亚蓝牙耳机为例四招即可破解!说到诺基亚,某个时代的xx后们不免会浮想联翩,毕竟曾经自己诺基亚过,摔过三瓣的诺基亚,拾起拼接后继续贪吃蛇。其实,还挺想……7。98万起,配刀片电池矩阵大灯,最大续航401km的元Pr目前来看,咱们自主品牌最有可能抢占新能源市场先机,并实现完全转型的车企,大概率都会是比亚迪了。从销量上,比亚迪近两个月的EV、DM家族销量纷纷实现了暴涨,占据比亚迪总销量大头。……小米新品指尖积木PLUSPLUSPLUS,超大减压神器玩转指生活在工作日和即将迎来的工作日循环交替中,面对排山倒海的业绩和处理不完的家务事,连敲击键盘的力气都要没有了,好想把属于自己的快乐时光攥在手里不松开!近日,小米商城众筹上新……华为发布新品折叠屏手机,折叠屏风口或悄然已至据和讯科技网消息,近日,华为举办的冬季新品发布会中,推出折叠屏手机新品华为P50Pocket,可实现机身的无缝折叠,后置镜头支持荧光摄影功能,售价8988元起。此前,OP……万钢尽快发布汽车产业绿色低碳发展路线图,突破核心瓶颈技术新京报贝壳财经讯(记者王琳琳)3月26日,在中国电动汽车百人会论坛(2022)上,全国政协副主席、中国科学技术协会主席万钢表示,面对碳中和,整个汽车产业界要协同作战,尽快发布汽……记一次MyBatisPlus中SelectOne踩坑一个数据一、背景今天一个线上问题报错如下:org。apache。ibatis。exceptions。TooManyResultsException:Expectedo……招商局座中国电池企业150强本盘点是基于2017、2018、2019三年中国电池企业百强榜单的数据,共计152家,排名按照升序规则。在中国生产电池相关产品的企业远远不止这么多,后续局座也将进一步更新名单,……2021宏碁全球春季发布会推出传奇X,引领轻薄全能体验2021年5月27日以开启新视角为主题的2021宏碁全球春季新品发布会召开,此次宏碁突破以往轻薄本体型对性能的限制,推出传奇X将轻薄本推到一个新的境界,为其轻巧便携的机身赋予强……4个Javascript中的for循环在ECMAScript5(简称ES5)中,有三个循环。在2015年6月发布的ECMAScript6(简称ES6)中,新增了一种循环类型。他们是:forforinforeachf……买手机一定要精挑细选,目前这4款手机非常值得考虑,你会买吗?现在大家经常会在网络当中看到这样的言论,当下的手机性能存在很大的问题,因此购买手机的话选择适合自己的就好,不必要去看重它的各方面性能。实际上这些言论还是有一定的道理,不论如何,……家人反对整天抱手机,但除了抱手机还能做什么?你呢?我常想,手机到底给我们带来了些什么?让我们大家人人都离不开,社会发展如此快,有时候都不敢相信手机给我们带来的无数惊喜,娱乐,社交,买卖购物,现在连上课都可以,等等功能,让每一个……
ElasticSearch字段属性个性化设置为马化腾辩护的精神资本家们,又开始群起围攻司马南央视的呼吁见效了?中企开窍感谢苹果的抛弃紧急发布iOS14。8正式版系统,修复重大问题TCL电子(01070)发力元宇宙,MiniLED智屏及AR抛弃安全感,走出低谷什么情况下需要换手机?工信部发话,手机预装APP必须可卸载!再也不怕厂家乱装APP为什么只有中国电商行业非常发达,难道是外国技术不行?好家伙,华为MatePadPro10。8英寸搭载骁龙870,iOS不再独享!移动端专业视频剪辑器登陆安卓,三星新平板首发家用智能NBlot燃气报警器厂家品牌推荐

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利