做带v头像的网站/app拉新接单平台
解释一下表id与表字段不对应,例如:
xxx表id name1 张三 2 李四3 王五
//表id与表字段不对应,按正常来说我们查询数据查出来时id=1、name=张三,id=2、name=李四,id=3、name=王五
//遇到一个bug它查询出来的数据时id=1、name=李四,id=2、name=王五,id=3、name=张三
//不一定是往后面推了一位,只是单纯的id与字段名不一致。
在做一个删除的操作时删除一条数据时,发现要删除的数据没有删掉,而是删掉了另外一条数据。我起初的认为是获取的要删除数据的主键id不正确,但我打开数据库查看时,发现我要删除的数据已经删除了,但是页面的显示却显示的不是主键id那一行数据而是其他行的数据。
如下图是我要删除数据的表:
如下图是我查询出来的数据,因为是多表查询,查询出来的是中间表的主键id和关联表(song表)的name
如下图是我的歌曲表
所以我猜想是我的查询出现了问题。为了验证我的猜想我去测试了一下新增数据,发现在数据库新增的数据没有问题,但在页面查询展示却是数据不对应。
这是我查询的方法
@GetMapping("/selectListsong")public List<Map<Object,Object>> selectListsong(@RequestParam("id") Integer id){//根据表字段查询数据Map<String, Object> columnMap=new HashMap<>();columnMap.put("song_list_id",id);List<ListSong> gg = listSongService.listByMap(columnMap);//创建一个集合,通过for循环取出ListSong表中歌曲的idList<Integer>songids=new ArrayList<>();for (int i=0; i<gg.size();i++){songids.add(gg.get(i).getSongId());}//通过id的集合查询数据数据List<Song> nn = songService.listByIds(songids);List<Map<Object,Object>> hh=new ArrayList<>();for (int i=0; i<gg.size();i++){Map<Object,Object> kk=new HashMap<>();kk.put("id",gg.get(i).getId());kk.put("name",nn.get(i).getName());hh.add(kk);}return hh;}
总体上是没有什么问题的,当初做查询是只顾着考虑中间的表的主键id,新增和删除中间表的主键id数量都会发生变化,但与中间表相关联的歌曲表如果你没执行相应的操作(去新增和删除歌曲)歌曲的数量是不会变的。
//在以上方法中的这一步
//在主键id数量发生变化时,没有考虑到歌曲表
//所以我们要加个条件使其中间表的song_id会等于歌曲表的主键id
for (int i=0; i<gg.size();i++){Map<Object,Object> kk=new HashMap<>();kk.put("id",gg.get(i).getId());kk.put("name",nn.get(i).getName());hh.add(kk);}
//=========改进后======
for (int i=0; i<gg.size();i++){Map<Object,Object> kk=new HashMap<>();kk.put("id",gg.get(i).getId());for (int j=0;j<gg.size();j++)if(gg.get(i).getSongId().equals(nn.get(j).getId())){kk.put("name",nn.get(j).getName());}
//多加了一层for循环使其遍历出来的id与值name相对应