MyBatisCodeHelper-Pro
MyBatisCodeHelper-Pro copied to clipboard
ignoreSql后字段高亮、字段提示、代码格式化、枚举导航问题
我的sql属于动态sql,有几个问题。
问题一、类似下面写法:
select ${@[email protected]()} AS 'type'
select的时候使用了枚举的值作为列的值,不加ignoreSql则标红,但是格式化正常;加了ignoreSql之后,按住Ctrl不能再导航到枚举;同时格式化后代码格式也没了缩进。
下图:没加ignoreSql,格式化正常,按住Ctrl也能导航到对应枚举
下图:加了ignoreSql,格式化不正常,按住Ctrl不能导航到对应枚举
问题二、类似下面写法
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只会解决标红问题,加了还是没有关键字、数据库字段高亮,数据库字段提示
${@[email protected]()} 这种是加$ 注释,choose when是要加ignore 当你写代码的时候把其他分支设为ignore就可以代码提示了 同时高亮多个choose when条件现在还不支持。
$注释:
choose when ignore注释:
@gejun123456 感谢解答,但是还有问题,具体如下。
$sql注释第一个问题: 如下图,我这两个查询没有查表,直接查的枚举,类似于
select "张三" as `name`
这种写法由于没有跟具体的表,$sql注释本身会变红
$sql注释第二个问题: 我的查询语句必须用枚举的值,而这个值是通过getValue()方法获取的(mybatis plus的枚举接口),如果用$sql注释,调用枚举方法的地方报:
'{' expected, got 'getValue'
如下图:
我不能直接用枚举去数据库查询,因为数据库里面存的是枚举的对应的值。枚举部分代码如下图:
针对$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和后面字段之间能否增加一个或多个空格来分割下,不然连在一起不太容易阅读
谢谢详细的回复 ${@MyEnum.ENUMITEM.method()} 这种现在还不支持,需要优化下
目前可以弄个bind绑定下可以兼容 类似下面这种写法 $sql的注释里面是写你可能的值
对于@ignore sql 你在写choose when的代码的时候编辑某个分支时,把其他分支弄为ignore,当前分支高亮和代码提示应该是可以用的, 不过也可以优化为对每个choose when条件单独解析,去查找这个choose when条件的sql 前后缀进行解析,这块要想想怎么弄。
好的。感谢回复,期待后续更新。
ignore和sql注释的时候也希望能有一个或多个空格隔断下,便于阅读。