在项目中我们经常会遇到这种需求:
根据一组 ID 查询数据库,并返回指定字段列表。
我在写代码的时候,遇到了一个典型的坑,分享出来给大家。

一、问题背景

我的代码是这样写的(查询项目表的负责人信息):

@PostMapping("/getOwnerInfoList")
public Result getOwnerInfoList(@RequestBody List<Integer> pcIds) {
List<Map<String, Object>> result = pmPcService.listObjs(
new LambdaQueryWrapper<PmPc>()
.select(PmPc::getPcId, PmPc::getOwnerUserId, PmPc::getDocumentCode)
.in(PmPc::getPcId, pcIds),
pc -> {
PmPc p = (PmPc) pc; // 👈 报错点
Map<String, Object> map = new HashMap<>();
map.put("pcId", p.getPcId());
map.put("ownerUserId", p.getOwnerUserId());
map.put("documentCode", p.getDocumentCode());
return map;
}
);
return R.ok(result);
}

结果运行时直接报错:

java.lang.ClassCastException: java.lang.Integer cannot be cast to com.kakarote.pm.entity.PO.PmPc

二、原因分析

问题的关键在于 listObjs 方法的返回值

listObjs 的官方说明是:

查询并返回对象集合,默认只会返回查询结果的 第一列

也就是说,如果你 select 了三列(pcId, ownerUserId, documentCode),listObjs 默认只返回第一列 pcId
所以 pc 其实是 Integer,你强转成 PmPc 就会报 ClassCastException

如果你写了 resultHandler 回调,查询多列时返回的是 Object[],而不是实体对象。

三、正确的解决方案

 方式一:直接用 list

最简单的方式就是不用 listObjs,而是用 list,这样返回的就是实体对象

List<PmPc> list = pmPcService.list(new LambdaQueryWrapper<PmPc>().select(PmPc::getPcId, PmPc::getOwnerUserId, PmPc::getDocumentCode).in(PmPc::getPcId, pcIds)
);List<Map<String, Object>> result = list.stream().map(p -> {Map<String, Object> map = new HashMap<>();map.put("pcId", p.getPcId());map.put("ownerUserId", p.getOwnerUserId());map.put("documentCode", p.getDocumentCode());return map;
}).collect(Collectors.toList());return R.ok(result);

方式二:继续用 listObjs

如果一定要用 listObjs,正确写法如下:

List<Map<String, Object>> result = pmPcService.listObjs(new LambdaQueryWrapper<PmPc>().select(PmPc::getPcId, PmPc::getOwnerUserId, PmPc::getDocumentCode).in(PmPc::getPcId, pcIds),obj -> {Object[] arr = (Object[]) obj;  // listObjs 查询多列时返回 Object[]Map<String, Object> map = new HashMap<>();map.put("pcId", arr[0]);map.put("ownerUserId", arr[1]);map.put("documentCode", arr[2]);return map;}
);

四、总结

  • listObjs 默认只返回第一列,别以为它能直接返回实体

  • 如果你需要实体对象,用 list 更直观。

  • 如果你需要自定义对象,用 listObjs + Object[] 来处理。

💡 推荐:
如果业务中经常要查多列 → 用 list
如果只查单列(比如只查 id 列表) → 用 listObjs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/919609.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/919609.shtml
英文地址,请注明出处:http://en.pswp.cn/news/919609.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WT2606B 驱屏语音芯片新增蓝牙功能:功能集成一体化,产品升级自动化,语音交互无线化,场景应用普适化!

小伙伴们&#xff0c;欢迎来到我们的 &#xff03;唯创芯片小讲堂&#xff01;今天我们要为大家介绍一位多才多艺的"芯片全能手"——WT2606B驱屏语音芯片。这颗芯片将在今年8月的I0TE物联网展及ELEXCON 2025深圳国际电子展上大放异彩。在智能设备满天飞的今天&#x…

ORA-16331: container is not open ORA-06512: at “SYS.DBMS_LOGMNR“

使用Flink CDC、Debezium等CDC工具对Oracle进行基于log的实时数据同步时遇到异常ORA-16331: container is not open的解决方案。 1. 异常信息 异常信息通常如下&#xff1a; at oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1823) at oracle.jdbc…

「三维共振」:重构实体零售的破局模式

在电商冲击与消费升级的双重浪潮下&#xff0c;传统零售模式正面临前所未有的挑战。wo店首创的 “三维共振” 运营模式&#xff0c;以场景体验为根基、数据驱动为引擎、社群共生为纽带&#xff0c;构建起线上线下深度融合的新型零售生态&#xff0c;至今已实现连续 18 个月客流…

将集合拆分成若干个batch,并将batch存于新的集合

在使用saveAll()等方法时&#xff0c;为了防止集合元素过大&#xff0c;使用splitList将原集合&#xff0c;分割成若干个小集合 import java.util.ArrayList; import java.util.List;public class ListUtils {/*** 将集合拆分成若干个batch,并将batch存于新的集合** param list…

Java主流框架全解析:从企业级开发到云原生

Java作为一门历史悠久且应用广泛的编程语言&#xff0c;其强大的生态系统离不开各种优秀的框架支持。无论是传统的企业级应用开发&#xff0c;还是现代的微服务、云原生架构&#xff0c;Java都提供了丰富的框架选择。本文将全面解析当前主流的Java框架&#xff0c;涵盖Web开发、…

机器学习——网格搜索(GridSearchCV)超参数优化

网格搜索&#xff08;Grid Search&#xff09;详细教学1. 什么是网格搜索&#xff1f;在机器学习模型中&#xff0c;算法的**超参数&#xff08;Hyperparameters&#xff09;**对模型的表现起着决定性作用。比如&#xff1a;KNN 的邻居数量 n_neighborsSVM 的惩罚系数 C 和核函…

【LeetCode】18. 四数之和

文章目录18. 四数之和题目描述示例 1&#xff1a;示例 2&#xff1a;提示&#xff1a;解题思路算法一&#xff1a;排序 双指针&#xff08;推荐&#xff09;算法二&#xff1a;通用 kSum&#xff08;含 2Sum 双指针&#xff09;复杂度关键细节代码实现要点完整题解代码18. 四数…

Go语言入门(10)-数组

访问数组元素&#xff1a;数组中的每个元素都可以通过“[]”和一个从0开始的索引进行访问数组的长度可由内置函数len来确定。在声明数组时&#xff0c;未被赋值元素的值是对应类型的零值。下面看一个例子package mainfunc main(){var planets [8]stringplanets[0] "Mercu…

为什么经过IPSec隧道后HTTPS会访问不通?一次隧道环境下的实战分析

在运维圈子里&#xff0c;大家可能都遇到过这种奇怪的问题&#xff1a;浏览器能打开 HTTP 网站&#xff0c;但一换成 HTTPS&#xff0c;页面就死活打不开。前段时间&#xff0c;我们就碰到这么一个典型案例。故障现象某公司系统在 VPN 隧道里访问 HTTPS 服务&#xff0c;结果就…

【Linux系统】进程信号:信号的产生和保存

上篇文章我们介绍了Syetem V IPC的消息队列和信号量&#xff0c;那么信号量和我们下面要介绍的信号有什么关系吗&#xff1f;其实没有关系&#xff0c;就相当于我们日常生活中常说的老婆和老婆饼&#xff0c;二者并没有关系1. 认识信号1.1 生活角度的信号解释&#xff08;快递比…

WEB服务器(静态/动态网站搭建)

简介 名词:HTML(超文本标记语言),网站(多个网页组成一台网站),主页,网页,URL(统一资源定位符) 网站架构:LAMP(linux(系统)+apache(服务器程序)+mysql(数据库管理软件)+php(中间软件)) 静态站点 Apache基础 Apache官网:www.apache.org 软件包名称:…

开发避坑指南(29):微信昵称特殊字符存储异常修复方案

异常信息 Cause: java.sql.SQLException: Incorrect string value: \xF0\x9F\x8D\x8B\xE5\xBB... for column nick_name at row 1异常背景 抽奖大转盘&#xff0c;抽奖后需要保存用户抽奖记录&#xff0c;用户再次进入游戏时根据抽奖记录判断剩余抽奖机会。保存抽奖记录时需要…

leetcode-python-242有效的字母异位词

题目&#xff1a; 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的 字母异位词。 示例 1: 输入: s “anagram”, t “nagaram” 输出: true 示例 2: 输入: s “rat”, t “car” 输出: false 提示: 1 < s.length, t.length < 5 * 104 s 和 t 仅…

【ARM】Keil MDK如何指定单文件的优化等级

1、 文档目标解决在MDK中如何对于单个源文件去设置优化等级。2、 问题场景在正常的项目开发中&#xff0c;我们通常都是针对整个工程去做优化&#xff0c;相当于整个工程都是使用一个编译器优化等级去进行的工程构建。那么在一些特定的情况下&#xff0c;工程师需要保证我的部分…

零基础学Java第二十二讲---异常(2)

续接上一讲 目录 一、异常的处理&#xff08;续&#xff09; 1、异常的捕获-try-catch捕获并处理异常 1.1关于异常的处理方式 2、finally 3、异常的处理流程 二、自定义异常类 1、实现自定义异常类 一、异常的处理&#xff08;续&#xff09; 1、异常的捕获-try-catch捕…

自建开发工具IDE(一)之拖找排版—仙盟创梦IDE

自建拖拽布局排版在 IDE 中的优势及初学者开发指南在软件开发领域&#xff0c;用户界面&#xff08;UI&#xff09;的设计至关重要。自建拖拽布局排版功能为集成开发环境&#xff08;IDE&#xff09;带来了诸多便利&#xff0c;尤其对于初学者而言&#xff0c;是踏入开发领域的…

GitHub Copilot - GitHub 推出的AI编程助手

本文转载自&#xff1a;GitHub Copilot - GitHub 推出的AI编程助手 - Hello123工具导航。 ** 一、GitHub Copilot 核心定位 GitHub Copilot 是由 GitHub 与 OpenAI 联合开发的 AI 编程助手&#xff0c;基于先进大语言模型实现代码实时补全、错误检测及文档生成&#xff0c;显…

基于截止至 2025 年 6 月 4 日,在 App Store 上进行交易的设备数据统计,iOS/iPadOS 各版本在所有设备中所占比例详情

iOS 和 iPadOS 使用情况 基于截止至 2025 年 6 月 4 日&#xff0c;在 App Store 上进行交易的设备数据统计。 iPhone 在过去四年推出的设备中&#xff0c;iOS 18 的普及率达 88。 88% iOS 188% iOS 174% 较早版本 所有的设备中&#xff0c;iOS 18 的普及率达 82。 82% iOS 189…

云计算-k8s实战指南:从 ServiceMesh 服务网格、流量管理、limitrange管理、亲和性、环境变量到RBAC管理全流程

介绍 本文是一份 Kubernetes 与 ServiceMesh 实战操作指南,涵盖多个核心功能配置场景。从 Bookinfo 应用部署入手,详细演示了通过 Istio 创建 Ingress Gateway 实现外部访问,以及基于用户身份、请求路径的服务网格路由规则配置,同时为应用微服务设置了默认目标规则。 还包…

Vue 3项目中的路由管理和状态管理系统

核心概念理解 1. 整体架构关系 这两个文件构成了Vue应用的导航系统和状态管理系统&#xff1a; Router&#xff08;路由&#xff09;&#xff1a;控制页面跳转和URL变化Store&#xff08;状态&#xff09;&#xff1a;管理全局数据和用户状态两者协同工作实现权限控制 2. 数据流…