确认

  • [x] 我的版本是最新版本, 我的版本号与 version 相同, 并且项目里无依赖冲突
  • [x] 我已经在 issue 中搜索过, 确认问题没有被提出过
  • [x] 我已经修改标题, 将标题中的 描述 替换为你的想法(不得删除 描述 前面的部分)

功能改进

在dto中extends LambdaQueryWrapper,实现public String getSqlSegment()如下,即可直接将dto当作wrapper传入mapper进行查询。

希望固定一个方法比如getSqlSegment固定最先调用,或者提供一个单独的方法用于在参数收集完成后初始化wrapper

@EqualsAndHashCode(callSuper = true)
@Data
public class UserDto extends LambdaQueryWrapper<User> {
    private Long id;
    private String nameLike;
    private Integer ageStart;
    private Integer ageEnd;
    private String email;
    private LocalDateTime startCreateTime;
    private LocalDateTime endCreateTime;
    private List<Long> ids = new ArrayList<>();

    public UserDto addId(Long id){
        ids.add(id);
        return this;
    }

    @Override
    public String getSqlSegment() {
        this.like(this.nameLike != null, User::getName, nameLike);
        this.ge(this.ageStart != null, User::getAge, ageStart);
        this.le(this.ageEnd != null, User::getAge, ageEnd);
        this.like(this.email != null, User::getEmail, email);
        this.ge(this.startCreateTime != null, User::getCreateTime, startCreateTime);
        this.le(this.endCreateTime != null, User::getCreateTime, endCreateTime);
        this.in(!this.ids.isEmpty(), User::getId, ids);
        return super.getSqlSegment();
    }
}
public List<User> getUsers(UserDto dto) {
    return userMapper.selectList(dto);
}
@Mapper
public interface UserMapper extends BaseMapper<User>{
}

参考资料

No response

Comment From: totoro52

RPC 调用中的 Wrapper:不支持也不赞成在 RPC 调用中传输 Wrapper 对象。Wrapper 对象通常包含大量信息,不适合作为传输对象。正确的做法是定义一个 DTO(数据传输对象)进行传输,然后在被调用方根据 DTO 执行相应的操作。

维护性:避免在 Controller 层使用 Map 接收值,这种做法虽然开发时方便,但会给后续的维护带来困难。

问题反馈:不接受任何关于 RPC 传输 Wrapper 报错相关的 issue 或 pr。

安全性: QueryWrapper UpdateWrapper 字段部分,如有允许 前端传入 SQL 片段 这可能会导致 SQL 注入风险 需要校验,更多查看 预防安全漏洞

Comment From: miemieYaho

反复调用getSqlSegment你不就炸了,你不如换成 toWrapper