MyBatisCodeHelper-Pro icon indicating copy to clipboard operation
MyBatisCodeHelper-Pro copied to clipboard

ignoreSql后字段高亮、字段提示、代码格式化、枚举导航问题

Open yhl452493373 opened this issue 2 years ago • 4 comments

我的sql属于动态sql,有几个问题。

问题一、类似下面写法:

select ${@[email protected]()} AS 'type'

select的时候使用了枚举的值作为列的值,不加ignoreSql则标红,但是格式化正常;加了ignoreSql之后,按住Ctrl不能再导航到枚举;同时格式化后代码格式也没了缩进。

下图:没加ignoreSql,格式化正常,按住Ctrl也能导航到对应枚举 1

下图:加了ignoreSql,格式化不正常,按住Ctrl不能导航到对应枚举 2

问题二、类似下面写法

 SELECT zu.`name`            AS `name`,
               ifnull(t.`count`, 0) AS `count`,
               t.`type`             AS `type`
        FROM
        zfj_unit zu
            LEFT JOIN (
        <foreach collection="caseTypes" item="caseType" separator="UNION ALL">
            <choose>
                <when test="caseType != @com.optima.cemis.tj.enums.CaseType@INSPECT">
                    SELECT zci.c_belond_depart_name AS `name`,
                           zci.c_belond_depart_code AS `code`,
                           count(zci.id)            AS `count`,
                           #{caseType}              AS `type`
                    FROM zfa_case_info zci
                    <where>
                        zci.del_flag = '0'
                    </where>
                    GROUP BY zci.c_belond_depart_code
                </when>
                <when test="caseType == @com.optima.cemis.tj.enums.CaseType@INSPECT">
                    SELECT
                    zil.c_belond_depart_name AS `name`,
                    zil.c_belond_depart_code AS `code`,
                    count(zil.id) AS `count`, #{caseType} AS `type`
                    FROM zfc_inspect_log zil
                    <where>
                        zil.del_flag='0'
                    </where>
                    GROUP BY zil.c_belond_depart_code
                </when>
            </choose>
        </foreach>
        ) t ON t.`code` = zu.`code`

下图:foreach生成union语句时,里面两个when都是完整sql(因为查的不同表,字段不同),不加ignoreSql,标红,同时关键字SELECT也没有高亮,后面的字段也没有高亮,没有数据库字段提示,格式化也有点问题(SELECT后面的第一个字段也换行了)。这种写法加ignoreSql只会解决标红问题,加了还是没有关键字、数据库字段高亮,数据库字段提示 3

yhl452493373 avatar Sep 07 '22 09:09 yhl452493373

${@[email protected]()} 这种是加$ 注释,choose when是要加ignore 当你写代码的时候把其他分支设为ignore就可以代码提示了 同时高亮多个choose when条件现在还不支持。

$注释: add$sql

choose when ignore注释:

chooseWhenAutoComplete

gejun123456 avatar Sep 08 '22 07:09 gejun123456

@gejun123456 感谢解答,但是还有问题,具体如下。

$sql注释第一个问题: 如下图,我这两个查询没有查表,直接查的枚举,类似于

select "张三" as `name`

这种写法由于没有跟具体的表,$sql注释本身会变红 image

$sql注释第二个问题: 我的查询语句必须用枚举的值,而这个值是通过getValue()方法获取的(mybatis plus的枚举接口),如果用$sql注释,调用枚举方法的地方报:

'{' expected, got 'getValue'

如下图: image

我不能直接用枚举去数据库查询,因为数据库里面存的是枚举的对应的值。枚举部分代码如下图: image

针对$sql注释第一个问题,是否可以通过增加一个表名前缀的方式处理,比如我这里虽然是查的常量作为临时表的一个字段,但是我知道这个字段是case_info这表的,name我写成<!--$sqlcase_info.c_case_type-->这种形式,这不就能找到表了嘛

针对$sql注释第二个问题,可能需要老哥处理下,增加的匹配规则,以及按住ctrl后的枚举方法提示(老哥现在的匹配规则是匹配到调用某个枚举,但是还有存在调用某个枚举的某个方法或属性的情况,也就是没考虑到还存在 ${@MyEnum.ENUMITEM.method()}${@MyEnum.ENUMITEM.propertyName}这种写法

针对@ignoreSql注释,直接把该注释作用于范围内sql作为一个单独sql来进行高亮展示以及字段提示之类的(如果不是完整sql,则只高亮关键字,不检查其sql的正确性;如果是完整sql,高亮关键字和表字段),不知道这种方法可行不。

当然,以上都是我的一种想法,具体还需老哥去设计下。

另外,$sql或者@sql和后面字段之间能否增加一个或多个空格来分割下,不然连在一起不太容易阅读

yhl452493373 avatar Sep 09 '22 07:09 yhl452493373

谢谢详细的回复 ${@MyEnum.ENUMITEM.method()} 这种现在还不支持,需要优化下 目前可以弄个bind绑定下可以兼容 类似下面这种写法 $sql的注释里面是写你可能的值 image

对于@ignore sql 你在写choose when的代码的时候编辑某个分支时,把其他分支弄为ignore,当前分支高亮和代码提示应该是可以用的, 不过也可以优化为对每个choose when条件单独解析,去查找这个choose when条件的sql 前后缀进行解析,这块要想想怎么弄。

gejun123456 avatar Sep 10 '22 00:09 gejun123456

好的。感谢回复,期待后续更新。

ignore和sql注释的时候也希望能有一个或多个空格隔断下,便于阅读。

yhl452493373 avatar Sep 13 '22 00:09 yhl452493373