SpringBoot + MyBatis-Plus 使用 listObjs 報 ClassCastException 的原因與解決辦法

在項目中我們經常會遇到這種需求:
根據一組 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. 數據流…