我们项目在使用springboot和mybatis-plus进行web应用开发时,遇到一个很奇怪的问题。
服务在调用service的方法,通过主键来查询数据时,会出现错误的sql。
@RestController
public class AController {
private final AService aService;
@GetMapping("/asdf/{id}")
public R<AVo> getAById(@PathVariable("id") Long id) {
return R.ok(aService.getById(id));
}
}
@Service
public class AServiceImpl extends ServiceImpl<AMapper, A> implements AService {
@Autowired
private BService bService;
@Override
public AVo getById(Long id) {
AVo vo = new AVo();
C c= bService.getById(id);
return vo;
}
}
service的实现继承了mybatis-plus的类com.baomidou.mybatisplus.extension.service.impl.ServiceImpl,
mybatis-plus的实现
default T getById(Serializable id) {
return this.getBaseMapper().selectById(id);
}
@RestController
public class BController {
private final BService bService;
@GetMapping("/{mj}")
public R getById(@PathVariable("mj" ) Long mj) {
return R.ok(bService.getById(mj));
}
}
@Service
public class BServiceImpl extends ServiceImpl<BMapper, B> implements BService {
@Override
public List<Map<String, Object>> getByYwhs(String ywhs) {
return this.baseMapper.getByYwhs(ywhs);
}
@Override
public List<Map<String, Object>> getByIds(String ids, String zt) {
Map<String, Object> params = new HashMap<>(4);
params.put("IDS", ids);
params.put("ZT", zt);
return this.baseMapper.getByids(params);
}
}
当我访问这个Acontroller的/asdf/{id}接口时,通过AService会调用到BService的方法getById。
正常情况下,日志输出的sql语句应该是:select id,mj,mark from b where id=xx
但实际输出的sql如下:select id,mj,mark from b where mj=xx
难道就是因为我在BController写了一个带有这个注解@GetMapping("/{mj}")的接口吗?
经过排查发现,是同事在这个B的实体类上把注解@TableId写错位置了,把这个注解写到了mj字段上,实际应该在id字段上,经过修改后,程序运行正常了。哈哈!以下是修改正确的实体类:
public class B extends Model<B> {
@TableId
private Long id;
private Long mj;
}