确认

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

当前程序版本

mybatis-plus-generator 3.5.10.1

问题描述

本 issue 与 #6682 一致


从以前的版本升级上来后,运行这个 generator 生成的 entity 注解的先后顺序不统一,会导致git历史出现很多修改。

如图,左侧为 3.5.9 版本生成的 entity(先 @Schema,后 @TableField),右侧为 3.5.10.1 版本生成的(@Schema,@TableField 前后顺序不一致)。

Image

个人认为,此处排序应该 - 方案1:按照注解的首字母排序(例如 @Schema @TableField 按照 s < t 排序) - 方案2:按照注解名的长度排序(例如 @Schema @TableField 按照 "@Schema".length (6) < "@TableField".length (10) 排序)

从结果来看,似乎当前是按照整行代码的长度进行排序,就导致了@Schema@TableField 两者哪一行短哪行就在前面。

详细堆栈日志

试图阅读了一下源码,找到了这里(但这里似乎是针对entity类名上的注解排序,暂时还没有找到具体entity字段的注解排序的逻辑):

https://github.com/baomidou/mybatis-plus/blame/c9ec9569230b1ed34ab44d992107d8c1b7c588cd/mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/builder/Entity.java#L428

Comment From: nieqiurong

以字符长度

Comment From: coder-xiaomo

以字符长度

@nieqiurong 是的,就是说目前以字符长度或许不是最佳的排序方式。

按照注解的首字母 A-Z 排序,或者按照注解的注解名(不包含后面括号参数部分)的长度排序会更合适 。

这样不同字段的注解可以确保是统一顺序的,而且如果后续修改字段备注,也不会出现注解顺序前后变化的问题(同时也可以确保跟旧版的 generator 保持基本一致)

或者至少,给一个可以配置的配置项,或者能够 MybatisPlusConfig 配置类重写这个排序规则也可以,目前没办法修改这个配置

Comment From: nieqiurong

entityBuilder()
            .annotationAttributesFunction(annotationAttributes -> annotationAttributes.stream()
                .sorted(Comparator.comparingInt((AnnotationAttributes c) -> c.getDisplayName().charAt(1))).collect(Collectors.toList()))