确认

  • [X] 我使用的版本是最新版, 并且使用插件确认过项目里无依赖版本冲突
  • [X] 我已经在 issue 中搜索过, 确认问题没有被提出过
  • [X] 我已经修改标题, 将标题中的 描述 替换为遇到的问题

当前程序版本

3.5.6

问题描述

数据库字段 object_id 是字符串类型,索引 idx_module_version(module, object_id, object_version)

public List<DependencyChainVo> getDenpencyChain(Long objectId, String version, String module) {
        // 获取依赖关系
        LambdaQueryWrapper<DependencySnapshot> query = Wrappers.lambdaQuery();
        query.eq(DependencySnapshot::getObjectId, objectId)
                .eq(DependencySnapshot::getObjectVersion, version)
                .eq(DependencySnapshot::getModule, module);

query.eq(DependencySnapshot::getObjectId, objectId) 没有类型校验,导致出现隐式的类型转换

最终导致 mysql 索引不生效

生成的sql如下

explain analyze SELECT id FROM dependency_snapshot WHERE module = 'COMPONENT' AND object_id = 120185 AND object_version = '2.0.0'

能走索引的sql应该是

explain analyze SELECT id FROM dependency_snapshot WHERE module = 'COMPONENT' AND object_id = "120185" AND object_version = '2.0.0'

希望能有类型强校验,避免出现这种隐式的类型转换,提前发现可能导致索引不生效的问题

详细堆栈日志

No response

Comment From: miemieYaho

目前不考虑