前端vue
editAdmin (adminInfo) {
this.axios.get(this.$http.httpUrl('/system/admin/getRoleListByAdminId'), {
params: {
adminId: adminInfo.id
}
}).then(response => {
this.adminForm = {
id: adminInfo.id,
adminId: adminInfo.adminId,
loginName: adminInfo.loginName,
name: adminInfo.name,
mobile: adminInfo.mobile,
school_id: 0,
roleIds: [], // 角色id集合
disabledFlag: adminInfo.disabledFlag ? 1 : 0
}
this.showAdminForm = true
})
},
后端 controller
@GetMapping("getRoleListByAdminId")
@SystemLog(describe = "查看管理员详情")
public Result getRoleListByAdminId(Integer adminId) {
System.out.println("管理员"+adminId);
return Result.success(systemAdminService.getRoleListAdminId(adminId));
}
service层
@Transactional
public AdminRoleDto getRoleListAdminId(Integer adminId) {
AdminRoleDto adminRoleDto = baseMapper.selectById(adminId);
//System.out.println(adminRoleDto.getRoleId());
List<Integer> roleIds = systemAdminRoleService.findRoleListByAdminId2(adminId);
System.out.println(roleIds);
//获取角色id集合
if(ObjectUtils.isNotEmpty(adminRoleDto)){
Set<Integer> roleIds2 = new HashSet<Integer>(roleIds);
adminRoleDto.setRoleIds(roleIds2);
}
return adminRoleDto;
}
map层
List<Integer> findRoleListByAdminId2(Integer adminId);
Map XML SQL 层
<select id="findRoleListByAdminId2" parameterType="Integer" resultType="List">
select role_id from system_admin_role where admin_id = #{adminId}
</select>
对应的role_id 多条数据时候,debug反馈
Expected one result (or null) to be returned by selectOne(), but found: 3
Sql语句有错误吗? 再Navicate 运行查询结果能查询出对应的role_id.这个怎么改呢?
另外调了很久,原本其他项目的数据修改都能成功,但是前端的RoleIds[ ] 这个集合就是取不到数据,修改多了个问题。
xml写的有问题,返回类型写错了。
mybatis返回List< Integer >时resultType写java.lang.Integer而不是java.util.List
这个问题是由于在使用 MyBatis 的 selectOne 方法时,返回结果出现了多个值的情况。可能是由于查询条件不唯一或者数据重复造成的。需要检查查询条件和数据是否正确,并且确认数据库中是否存在重复数据。
解决思路是可以通过修改查询条件或者使用 selectList 方法来获取多个结果,然后再根据实际情况选择需要的结果。例如,可以使用以下代码来获取多个结果:
List userList = sqlSession.selectList("com.example.mapper.UserMapper.selectUserList", parameter);
如果需要确保只返回一个结果,则可以在 SQL 语句中添加 LIMIT 1 条件来限制结果数量。例如:
SELECT * FROM user WHERE id = #{id} LIMIT 1;
这样就可以确保只返回一个结果,避免出现多个结果的情况。
baseMapper.selectById(adminId); 这行代码有问题
回答应用chat gpt
根据您提供的代码和错误信息,可能有以下几个可能导致问题的原因:
1、返回结果不唯一: 您在 findRoleListByAdminId2 方法中使用了 select 查询语句,但可能返回了多个结果,而在 MyBatis 中,使用 selectOne 方法要求查询结果只能返回一个结果或者为空。因此,在这种情况下,您需要修改 findRoleListByAdminId2 方法的查询语句,确保只返回一个结果,例如使用 limit 关键字来限制结果集大小,或者使用其他适当的查询条件,以确保查询结果唯一。
例如,您可以将您的 SQL 查询语句修改如下,以限制结果集大小为1:
<select id="findRoleListByAdminId2" parameterType="Integer" resultType="Integer">
select role_id from system_admin_role where admin_id = #{adminId} limit 1
</select>
2、数据库中没有匹配的数据: 如果数据库中没有与给定的 adminId 匹配的数据,那么您可能会收到 "Expected one result (or null) to be returned by selectOne(), but found: 0" 的错误。在这种情况下,您需要确保数据库中存在与给定 adminId 匹配的数据,或者在代码中处理不存在数据的情况,例如返回一个空对象或者其他适当的错误信息。
3、前端 RoleIds 数组为空: 在前端 Vue 代码中,您在请求中传递的 adminInfo 对象中的 roleIds 字段是一个空数组 [],这可能导致在后端 controller 中接收到的 adminId 参数值为 null 或者未定义。因此,在前端调用 getRoleListByAdminId 方法时,确保将 roleIds 字段传递为非空数组或者处理 null 或者未定义的情况。
如果您仍然遇到问题,建议您检查数据库中的数据,确保数据库中存在与给定的 adminId 匹配的数据,并且在前端和后端代码中处理空数组和 null 值的情况,以确保数据传递和处理的正确性。此外,您还可以在后端服务层和前端 Vue 代码中添加日志输出和调试语句,以便更详细地查看代码的执行过程和数据传递情况,从而更好地定位和解决问题。
错误消息表明代码期望selectOne()方法返回单个结果或null,但实际上它返回了三个结果。如果方法中使用的查询没有正确地过滤结果,或者方法的实现方式存在问题,就会发生这种情况。需要进一步调试以确定错误的确切原因。
这个错误是因为 MyBatis 的 selectOne 方法期望查询结果只有一条或者为空,但是实际查询返回了多条结果,导致无法将多条结果转换为一个对象。
从你提供的代码看,问题可能出现在 getRoleListAdminId 方法中的以下这行代码上:
AdminRoleDto adminRoleDto = baseMapper.selectById(adminId);
通过 MyBatis 的 selectById 方法,我们期望查询并返回一个唯一对应名称的管理员信息。但是如果此管理员对应了多个角色,就会因为查询结果中存在多条数据而报错。
解决方法非常简单,只需要将上述代码替换为下面这行代码即可:
AdminRoleDto adminRoleDto = new AdminRoleDto();
这样就可以创建一个新的 AdminRoleDto 对象了,后面添加其它属性时也不会因为默认值为 null 而出现空指针异常。当然,这样的话也就意味着我们忽略了查询到的管理员信息,需要在接下来的代码执行中重新组装该对象。
当然,这只是其中一种简单的解决方案。如果你确定这个查询确实需要返回多个角色信息,你可以使用 selectList 方法来查询,并将查询结果集合赋值给 adminRoleDto 对象的 roleIds 属性。
<select id="findRoleListByAdminId2" parameterType="Integer" resultType="List">
select role_id from system_admin_role where admin_id = #{adminId}
</select>
resultType="List" 改为 resultType="String" 试一下
引用chatGPT作答,关于第一个问题,报错信息表明 selectOne() 方法期望返回一个结果或者 null,但实际返回了三个结果。这通常发生在使用 Mybatis 的 selectOne() 方法时,但实际查询结果返回了多条记录。这很可能是由于查询语句不准确导致的,可以尝试检查 SQL 查询语句,确保它只返回一个结果或者使用 selectList() 方法来返回多条结果。
根据您提供的信息,查询语句 select role_id from system_admin_role where admin_id = #{adminId} 可以正常运行并返回对应的 role_id,因此可能是在调用 selectById(adminId) 方法时发生了错误,或者是在其他地方的查询结果返回了多个值。您可以检查代码,确保在查询 adminRoleDto 对象时使用的查询语句只返回一个结果或者使用 selectList() 方法。
关于第二个问题,您提供的代码片段中没有展示 RoleIds 集合如何填充数据的代码。如果您的后端可以正常返回数据,那么问题可能出现在前端代码中。您可以尝试在调试期间添加一些日志语句,确认从后端接收到了正确的数据,以及前端代码是否正确地将这些数据填充到 RoleIds 集合中。另外,您可能还需要检查 adminInfo.id 是否有效,确保它被正确地传递给后端。
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
根据错误信息 Expected one result (or null) to be returned by selectOne(), but found: 3
,应该是在调用 selectById(adminId)
方法时出现了问题。因为 selectById()
方法是 MyBatis-Plus 提供的方法,它要求返回的结果只能有一条记录或者为空。但是在这里,根据您的反馈,同一个管理员可能有多个角色,因此查询结果就不止一条。
针对这种情况,您可以尝试使用 selectList()
方法来替代 selectById()
方法。具体实现方式如下:
将 service 层的代码
AdminRoleDto adminRoleDto = baseMapper.selectById(adminId);
修改为
List<AdminRoleDto> adminRoleDtos = baseMapper.selectList(new QueryWrapper<AdminRoleDto>().eq("admin_id", adminId));
AdminRoleDto adminRoleDto = adminRoleDtos.isEmpty() ? null : adminRoleDtos.get(0);
这样就可以获取到查询结果的列表,然后取出第一条记录作为返回结果。如果查询结果为空,则返回 null
。同时也要确保 resultType="List"
,因为返回的确实是一个列表。
至于前端的 roleIds
无法获取数据的问题,需要您提供更详细的代码和调用栈信息,才能进行排查。
如果我的回答解决了您的问题,请采纳!
数据出错了,排查下数据
语句没问题,用法问题。Expected one result (or null) to be returned by selectOne(), but found: 3,表示selectOne只希望取到1个结果有3个。你只希望使用一个roleIds,可以在SQL中加个限制只取结果集中1条记录,如:MySQL的limit 1、Oracle的top 1等。
是后台sql的问题。
1,查出的角色ID是数组,应该使用数组来接收,建议使用对象来接收。
2,如果只需要查出1个角色ID,可以在sql最后,加上limit 1
该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
这个错误提示是因为 MyBatis 在查询结果时期望只有一条记录(或者是 null),但在你的代码中,却返回了多条记录,即 3 条记录。这个问题可能是因为你在查询时,期望只查询到一条记录,但实际上查询到了多条记录,或者是在系统中有多个相同的记录。
要解决这个问题,你可以尝试在 SQL 语句中添加一些条件,以确保只返回一条记录。例如,你可以在 SQL 语句中添加 LIMIT 1
条件,以限制返回的结果数量只有一条,例如:
<select id="findRoleListByAdminId2" parameterType="Integer" resultType="List">
select role_id from system_admin_role where admin_id = #{adminId} limit 1
</select>
如果你期望查询到多条记录,则需要修改代码以处理多条记录的情况。你可以使用 List
类型来存储返回的结果,例如:
List<Integer> roleIds = systemAdminRoleService.findRoleListByAdminId2(adminId);
if (!CollectionUtils.isEmpty(roleIds)) {
Set<Integer> roleIds2 = new HashSet<>(roleIds);
adminRoleDto.setRoleIds(roleIds2);
}
另外,在代码中你也可以加入一些日志打印,以帮助你更好地定位问题。例如,在 getRoleListAdminId
方法中,你可以添加以下代码:
List<Integer> roleIds = systemAdminRoleService.findRoleListByAdminId2(adminId);
if (CollectionUtils.isEmpty(roleIds)) {
log.warn("No role found for admin with ID: {}", adminId);
} else {
log.debug("Found roles {} for admin with ID: {}", roleIds, adminId);
Set<Integer> roleIds2 = new HashSet<>(roleIds);
adminRoleDto.setRoleIds(roleIds2);
}
这样可以在运行时输出日志,便于你定位问题。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢