mybatis-plus 返回部分字段的解决方式

mybatis-plus的代码生成器会在实体类中生成数据库所有字段,我们去用mapper接口查询时,会返回数据库所有的字段。

但有些字段不是我们想要的,比如:deleted,所以我们可以在不需要的字段上面加@JsonIgnore注解,返回给前端的时候会自动把这个字段去除。

补充知识:Mybatis-Plus只查询特定字段与创建子类方法

Mybatis-Plus查询特定字段例子:

Seal seal = sealService.selectOne(

new EntityWrapper<Seal>().setSqlSelect("sealName").eq("sealId",auditProcess.getSealId()));

其中这里的seal是一个自定义类。"sealName"是数据库表seal的一个字段,这句查询只查到id为 auditProcess.getSealId() 的seal的名称。其余字段为null

创建子类方法。

一般需要联表的情况,又不想写sql语句,可以试下这种方法(至于效率,我也没有测试过)

上个例子

Manager类

/**
 * <p>
 *
 * </p>
 *
 * @author onee123
 * @since 2019-03-03
 */
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("_manager")
public class Manager extends Model<Manager> {

  private static final long serialVersionUID = 1L;

  /**
   * 管理员id
   */
  @TableId(value = "manager_id",type = IdType.UUID)
  private String managerId;
  /**
   * 账号
   */
  @TableField("manager_phone")
  private String managerPhone;
  /**
   * 密码
   */
  @TableField("manager_pass")
  private String managerPass;
  /**
   * 姓名
   */
  @TableField("manager_name")
  private String managerName;
  /**
   * 邮箱
   */
  @TableField("manager_email")
  private String managerEmail;
  /**
   * 状态(0:1-删除:启动)
   */
  @TableField("manager_status")
  private Integer managerStatus;
  /**
   * 权限id
   */
  @TableField("role_id")
  private String roleId;
  /**
   * 部门
   */
  @TableField("manager_department")
  private String managerDepartment;
  /**
   * 创建时间
   */
  @TableField("manager_create_time")
  private Date managerCreateTime;
  /**
   * 最近登陆时间
   */
  @TableField("manager_login_time")
  private Date managerLoginTime;

  @Override
  protected Serializable pkVal() {
    return this.managerId;
  }

}

Seal类

/**
 * <p>
 *
 * </p>
 *
 * @author wihenne123
 * @since 2020-04-24
 */
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("_seal")
public class Seal extends Model<Seal> {

  private static final long serialVersionUID = 1L;

  /**
   * 印章id
   */
  @TableId(value="seal_id",type = IdType.UUID)
  private String sealId;
  /**
   * 印章名
   */
  @TableField("seal_name")
  private String sealName;
  /**
   * 图片路径
   */
  @TableField("picture_path")
  private String picturePath;
  /**
   * 创建时间
   */
  @TableField("create_time")
  private Date createTime;
  /**
   * 更新时间
   */
  @TableField("update_time")
  private Date updateTime;
  /**
   * (-1:0:1 - 删除:停用:启用)
   */
  @TableField("seal_status")
  private Integer sealStatus; 

  @Override
  protected Serializable pkVal() {
    return this.sealId;
  }
}

AuditProcess类,其中managerId和sealId需要对应上面两个表。

/**
 * <p>
 *
 * </p>
 *
 * @author wihenne123
 * @since 2020-04-24
 */
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("_audit_process")
public class AuditProcess extends Model<AuditProcess> {

  private static final long serialVersionUID = 1L;

  /**
   * 流程图id
   */
  @TableId(value = "audit_id", type = IdType.AUTO)
  private Integer auditId;
  /**
   * 流程名称
   */
  @TableField("audit_name")
  private String auditName;
  /**
   * 审核顺序(,隔开-店长用shopManager表示)
   */
  @TableField("audit_sort")
  private String auditSort;
  /**
   * 状态(-1:0:1-删除:停用:启用)
   */
  @TableField("audit_status")
  private Integer auditStatus;
  /**
   * 创建时间
   */
  @TableField("create_time")
  private Date createTime;
  /**
   * 更新时间
   */
  @TableField("update_time")
  private Date updateTime;
  /**
   * 印章id(无则为0)
   */
  @TableField("seal_id")
  private String sealId;
  /**
   * 创建人id
   */
  @TableField("manager_id")
  private String managerId;
  /**
   * 印章x位置
   */
  @TableField("seal_x")
  private Double sealX;
  /**
   * 印章y位置
   */
  @TableField("seal_y")
  private Double sealY;
  /**
   * 印章大小
   */
  @TableField("seal_size")
  private Double sealSize;
  /**
   * 印章所在页码
   */
  @TableField("seal_page")
  private Integer sealPage;
  /**
   * 序号x位置
   */
  @TableField("num_x")
  private Double numX;
  /**
   * 序号y位置
   */
  @TableField("num_y")
  private Double numY;
  /**
   * 序号大小
   */
  @TableField("num_size")
  private Double numSize;
  /**
   * 序号所在页码
   */
  @TableField("num_page")
  private Integer numPage;
  /**
   * pdf文件demo路径
   */
  @TableField("pdf_demo_path")
  private String pdfDemoPath;
  /**
   * 反馈文件路径
   */
  @TableField("result_file_path")
  private String resultFilePath;
  /**
   * 最大打印次数
   */
  @TableField("print_size")
  private Integer printSize;

  @Override
  protected Serializable pkVal() {
    return this.auditId;
  }

}

这时候我只需要对应id的类的名称,所以我设置了vo类作为子类

然后在接口里面写转换方法

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author wihenne123
 * @since 2020-04-23
 */
@Service
public class AuditProcessServiceImpl extends ServiceImpl<AuditProcessMapper, AuditProcess> implements AuditProcessService {
  @Autowired
  ManagerService managerService;
  @Autowired
  SealService sealService;
  @Autowired
  AuditProcessService auditProcessService;

  @Override
  public List<AuditProcessVo> auditProcessToVo(List<AuditProcess> auditProcessList) {
    List<AuditProcessVo> auditProcessVos = new ArrayList<>();
    for(AuditProcess auditProcess:auditProcessList){
      //遍历list
      auditProcessVos.add(auditProcessToVo(auditProcess));
    }
    return auditProcessVos;
  }

  @Override
  public AuditProcessVo auditProcessToVo(AuditProcess auditProcess) {
    AuditProcessVo auditProcessVo = new AuditProcessVo();
    BeanUtils.copyProperties(auditProcess,auditProcessVo); //复制进vo类

    Manager manager = managerService.selectOne(
        new EntityWrapper<Manager>().setSqlSelect("manager_name","manager_department").eq("manager_id",auditProcess.getManagerId()));
    //加入字段值
    auditProcessVo.setManagerName(manager.getManagerName());
    auditProcessVo.setManagerDepartment(manager.getManagerDepartment());

    if(auditProcess.getSealId() != null){
      Seal seal = sealService.selectOne(
          new EntityWrapper<Seal>().setSqlSelect("seal_name").eq("seal_id",auditProcess.getSealId()));
      if(seal != null){
        auditProcessVo.setSealName(seal.getSealName());
      }
    }else {
      auditProcessVo.setSealName("无");
    }

    return auditProcessVo;
  }
}

再想调用时直接调用就可以了

以上这篇mybatis-plus 返回部分字段的解决方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

时间: 2020-09-30

mybatis升级mybatis-plus时踩到的一些坑

前言 最近使用RuoYi-Vue来做后台管理脚手架.RuoYi-Vue 是一个 Java EE 企业级快速开发平台,基于经典技术组合(Spring Boot.Spring Security.MyBatis.Jwt.Vue),内置模块如:部门管理.角色用户.菜单及按钮授权.数据权限.系统参数.日志管理.代码生成等.在线定时任务配置:支持集群,支持多数据源.其官方文档如下 http://doc.ruoyi.vip/ 感兴趣的朋友,可以点链接查看.这个平台目前的orm框架是mybatis,而项目组的o

Mybatis多个字段模糊匹配同一个值的案例

需求: 搜索框中可输入手机号,姓名,地址查询,后台需要对一个框中的多个字段做匹配查询. 搜索 可以在sql语句中做拼接条件查询: <if test="condition!=null and condition!=''"> AND CONCAT(r.name,a.name,a.phone,a.addr_detail) LIKE '%' #{condition} '%' </if> 补充知识:在Mybatis xml使用mysql数据库进行多字段模糊查询(Like)

完美解决MybatisPlus插件分页查询不起作用总是查询全部数据问题

问题描述: 在使用mybatisplus插件进行分页查询时分页参数不起作用,总是查出来全部数据. 原因分析: 查看打印的sql日志发现sql后面并没有limit条件,怀疑是缺少配置. 解决方案: 查阅资料通过添加配置类MybatisPlusConfig解决问题: @Configuration public class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor(){ return new

thinkphp多表查询两表有重复相同字段的完美解决方法

框架:thinkphp 版本:3.2.3 内容:查询语句 解决问题:重复字段问题 $Data = M('a')->where($where) ->Field('a.name as aname,b.name as uname,a.*') ->join('b on b.jb_id=a.id') ->order('a.id desc') ->select(); 解释:a.* 查询a表所有的字段 a.name as aname 转换a表中的name重复字段为aname 以上就是小编为

完美解决因数据库一次查询数据量过大导致的内存溢出问题

刚开始接触项目的实习生,积累经验,欢迎交流 之前做项目,遇到过一次查询数据量过大而导致的内存溢出问题,找了很多办法一直未能实际解决问题, 今天又遇到了,经过前辈的指导,终于解决了问题!! 不过此方法只在DBug启动下有效 以上这篇完美解决因数据库一次查询数据量过大导致的内存溢出问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

解决mybatis-plus使用jdk8的LocalDateTime 查询时报错的方法

mybatis-plus使用jdk8的LocalDateTime 查询时报错: org.springframework.dao.InvalidDataAccessApiUsageException: Error attempting to get column 'update_time' from result set.  Cause: java.sql.SQLFeatureNotSupportedException ; null; nested exception is java.sql.SQ

springboot整合mybatis-plus 实现分页查询功能

建一个config类 @Configuration public class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor(){ return new PaginationInterceptor(); } } 编写controller post /article/search/{page}/{size} @PostMapping("search/{page}/{size}") p

完美解决idea无法搜索下载插件的问题

IDEA无法搜索插件 最近重装了系统,需要配置好多环境,但当我在idea中搜索插件的时候,发现idea Plugins居然搜索不到插件,百度了下,有些是设置idea勾选的,不过我试了之后,然并卵.... 我的解决办法: 我的这个问题研究了好长时间,最后居然发现是我这边宽带运营商的问题,运营商国内网速很ok,但却屏蔽了idea下载插件的网址..最后手机开热点解决...... 补充知识:解决idea不能搜索任何插件 出现原因:IDEA的模块系统加载不出来,是由于IDEA的网络安全机制造成的,类似于w

完美解决java.lang.OutOfMemoryError处理错误的问题

原因: 常见的有以下几种: 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据: 2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收: 3.代码中存在死循环或循环产生过多重复的对象实体: 4.使用的第三方软件中的BUG: 5.启动参数内存值设定的过小: 常见错误提示: 1.tomcat:java.lang.OutOfMemoryError: PermGen space 2.tomcat:java.lang.OutOfMemoryError: Java heap space 3

AJAX中文乱码PHP中完美解决方法

最近在做一个项目,遇到AJAX中文乱码问题,经过一个下午的努力终于完美解决,现将心得写下来,希望对那些还困绕在这个问题而头痛不已的人们有所帮助. 众所周知,使用AJAX传送和接收中文参数时,如果不在客户端和服务器做相应的处理就会出现乱码问题,在网上相应的文章也不少,但是有的情况下很难从中找到符合自己理想的答案,我今天就是在网上找了很多,但是都差不多,讲ASP和JSP的比较多(我是用的PHP),所以到最后都没找到自己满意的答案. AJAX的中文乱码可以大概分为两中,第一种是向服务器端发送中文参数时

oracle表被锁定的完美解决方法

解决办法: ora-00031:session marked for kill处理oracle中杀不掉的锁一些ORACLE中的进程被杀掉后,状态被置为"killed",但是锁定的资源很长时间不释放,有时实在没办法,只好重启数据库.现在提供一种方法解决这种问题,那就是在ORACLE中杀不掉的,在OS一级再杀. 下面的语句用来查询哪些对象被锁: select object_name,machine,s.sid,s.serial# from v$locked_object l,dba_obj

完美解决Android Studio集成crashlytics后无法编译的问题

问题描述: 在用fabric集成后编译出现如下错误, Error:Cause: hostname in certificate didn't match: <maven.fabric.io> != <*.motili.com> OR <*.motili.com> OR <motili.com> build.gradle部分脚本(fabric插件自动生成的): buildscript { repositories { maven { url 'https://