项目场景:
项目场景:练手项目-云E办 后台员工中的分页查询员工列表
问题描述
在查询的时候报500错误
查看idea控制台发现报错java.lang.IllegalArgumentException: argument type mismatch
实体类代码:
/**
* @author az
* @since 2022-04-04
*/
@Data
@TableName("t_employee")
@ApiModel(value = "Employee对象", description = "")
@AllArgsConstructor
@NoArgsConstructor
public class Employee {
// 其余业务字段
...
// 在查询时做了嵌套查询,在这个实体类中嵌套了几个其他实体类的对象
@ApiModelProperty("民族对象")
@TableField(exist = false)
private Nation nation;
@ApiModelProperty("政治面貌对象")
@TableField(exist = false)
private PoliticsStatus politicsStatus;
@ApiModelProperty("部门对象")
@TableField(exist = false)
private Department department;
@ApiModelProperty("职称对象")
@TableField(exist = false)
private Joblevel joblevel;
@ApiModelProperty("职位对象")
@TableField(exist = false)
private Position position;
}
Nation对象实体类代码:
/**
* @author az
* @since 2022-04-04
*/
@Data
@TableName("t_nation")
@ApiModel(value = "Nation对象", description = "")
public class Nation {
@ApiModelProperty("id")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty("民族")
@TableField("name")
private String name;
}
PoliticsStatus对象实体类代码:
/* * @author az
* @since 2022-04-04
*/
@Data
@TableName("t_politics_status")
@ApiModel(value = "PoliticsStatus对象", description = "")
public class PoliticsStatus {
@ApiModelProperty("id")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty("政治面貌")
@TableField("name")
private String name;
}
Department对象实体类代码:
/** @author az
* @since 2022-04-04
*/
@Data
@Builder
@TableName("t_department")
@ApiModel(value = "Department对象", description = "")
public class Department {
@ApiModelProperty("id")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty("部门名称")
@TableField("name")
private String name;
@ApiModelProperty("父id")
@TableField("parentId")
private Integer parentId;
@ApiModelProperty("路径")
@TableField("depPath")
private String depPath;
@ApiModelProperty("是否启用")
@TableField("enabled")
private Boolean enabled;
@ApiModelProperty("是否上级")
@TableField("isParent")
private Boolean isParent;
@ApiModelProperty("子部门")
@TableField(exist = false)
private List<Department> children;
@ApiModelProperty("返回结果,存储过程中使用")
@TableField(exist = false)
private Integer result;
}
Joblevel对象实体类代码:
/*@author az
* @since 2022-04-04
*/
@Data
@TableName("t_joblevel")
@ApiModel(value = "Joblevel对象", description = "")
public class Joblevel {
@ApiModelProperty("id")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty("职称名称")
@TableField("name")
private String name;
@ApiModelProperty("职称等级")
@TableField("titleLevel")
private String titleLevel;
@ApiModelProperty("创建时间")
@JsonFormat(pattern = "yyyy-MM-dd",timezone = "Asia/Shanghai")
@TableField("createDate")
private LocalDateTime createDate;
@ApiModelProperty("是否启用")
@TableField("enabled")
private Boolean enabled;
}
Position对象实体类代码:
/** @author az
* @since 2022-04-04
*/
@Data
@TableName("t_position")
@ApiModel(value = "Position对象", description = "")
public class Position {
@ApiModelProperty("id")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty("职位")
@TableField("name")
private String name;
@ApiModelProperty("创建时间")
@TableField("createDate")
@JsonFormat(pattern = "yyyy-MM-dd",timezone = "Asia/Shanghai")
private LocalDateTime createDate;
@ApiModelProperty("是否启用")
@TableField("enabled")
private Boolean enabled;
}
原因分析:
将查询SQL查出的数据与Mybatis填充的数据进行比对,结果发现参数的数量不一致,Mybatis填入的参数中要比查询出来的字段要多几个。
原因是因为在 嵌套的几个实体类中没有找到其构造方法,于是将嵌套的对象当作一个字段处理,而不是我们想要的当作对象进行处理,最后就导致每个对象中查询出多个数据,但Mybatis进行填充的时候把一个对象对应一个参数进行填充,最后导致参数数量不一致。
解决方案:
将嵌套的对象实体类中都添加上有参构造和无参构造即可
我这里是用的Lombok的注解,在Nation、PoliticsStatus、Department、Joblevel、Position实体类中添加上@AllArgsConstructor
和@NoArgsConstructor
注解即可
成功查询出需要的数据:
推荐
关注博客和公众号获取最新文章