Expected one result (or null) to be returned by selectOne(), but found: 3

前端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

内容来源与ChatGpt4及newbing和百度:


这个问题是由于在使用 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);
}

这样可以在运行时输出日志,便于你定位问题。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢