确认
- [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