Oracle遷移到高斯,查詢字段默認小寫,解決辦法

一、問題說明

Oracle中,查詢結果字段默認大寫。

在這里插入圖片描述

高斯中,查詢結果字段默認小寫。

在這里插入圖片描述
在Mybatis的xml中,如果查詢語句使用Map接收查詢結果,使用resultType="java.util.HashMap"resultType="Map"等寫法,返回的Map對象中,Key就是字段名,從Oracle遷移到高斯,大寫變成小寫,存在兼容性問題。

二、解決辦法

方案1、使用字段別名

當代碼中使用Map接收查詢結果使用比較少時,可以直接修改sql,通過為字段指定別名的方式,實現最終字段名為大寫,如上面演示的user_id AS "USER_ID"

方案2、自定義Mybatis攔截器

通過mybatis攔截器實現查詢結果返回后,如果通過Map類型接收查詢結果,將Key轉為大寫。
1. 創建自定義mybatis攔截器

import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;import java.lang.reflect.Method;
import java.util.*;/*** @desc Map接收查詢結果,將Map的Key轉為大寫,解決從Oracle切換高斯后,高斯默認小寫,JSP字段綁定異常,生成推送文件字段變化等問題* {@link MapKeyUpperCase}*/
@Intercepts({@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class,ResultHandler.class})})
public class MapKeyUpperCaseInterceptor implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {// 執行原方法,獲取返回結果Object result = invocation.proceed();// 獲取當前執行的Mapper方法,Executor.query的第一個參數為MappedStatementMappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];// 方法全路徑:com.example.mapper.UserMapper.selectUserMapString methodName = mappedStatement.getId();// 通過反射獲取Mapper接口的方法,檢查是否有自定義注解String className = methodName.substring(0, methodName.lastIndexOf("."));String simpleMethodName = methodName.substring(methodName.lastIndexOf(".") + 1);Class<?> mapperInterface = Class.forName(className);Method method = Arrays.stream(mapperInterface.getMethods()).filter(m -> m.getName().equals(simpleMethodName)).findFirst().orElse(null);// 只對配置了自定義注解的方法生效if (method != null && method.isAnnotationPresent(MapKeyUpperCase.class)) {// 返回結果是List,處理每一項if (result instanceof List) {List<Map<?, ?>> resultList = (List<Map<?, ?>>) result;for (Map<?, ?> map : resultList) {// 原記錄索引替換為新記錄resultList.set(resultList.indexOf(map), upCaseResultMapKey(map));}return resultList;}// 返回單條記錄else if (result instanceof Map) {return upCaseResultMapKey((Map<?, ?>) result);}}return result;}/*** @param resultMap 初始查詢結果* @return java.util.HashMap<java.lang.Object, java.lang.Object>* @desc 將Map接收的查詢結果的Key轉為大寫*/private HashMap<Object, Object> upCaseResultMapKey(Map<?, ?> resultMap) {HashMap<Object, Object> newMap = new HashMap<>();for (Map.Entry<?, ?> entry : resultMap.entrySet()) {Object key = entry.getKey();Object value = entry.getValue();if (key instanceof String) {newMap.put(((String) key).toUpperCase(), value);} else {newMap.put(key, value);}}return newMap;}@Overridepublic Object plugin(Object target) {if (target instanceof Executor) {return Plugin.wrap(target, this);}return target;}@Overridepublic void setProperties(Properties properties) {}}

2. 創建自定義注解

import java.lang.annotation.*;
/*** @desc 聲明在Mapper中以Map接收查詢結果的查詢方法上,標明該方法返回字段名稱大寫* {@link MapKeyUpperCaseInterceptor}*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MapKeyUpperCase {
}

3. 注冊Mybatis攔截器
傳統方式,在mybatis-config.xml中注冊攔截器

<configuration><plugins><plugin interceptor="com.example.MapKeyUpperCaseInterceptor"></plugin></plugins>
</configuration>

在Springboot中注冊Mybatis攔截器,參考下面代碼

@Configuration
public class MyBatisConfig {@Beanpublic MapKeyUpperCaseInterceptor mapKeyUpperCaseInterceptor() {return new MapKeyUpperCaseInterceptor();}@Beanpublic SqlSessionFactory sqlSessionFactory(DataSource dataSource, MapKeyUpperCaseInterceptor mapKeyUpperCaseInterceptor) throws Exception {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);factoryBean.setPlugins(mapKeyUpperCaseInterceptor); // 注冊攔截器return factoryBean.getObject();}
}

4. 在需要將Map中的Key轉為大寫的方法上,聲明自定義注解
在需要大寫的mapper方法上聲明該注解,實現返回Map對象Key是否大寫的配置,如

@MapKeyUpperCase
Map<String, Object> getMap();@MapKeyUpperCase
List<Map<String, Object>> getMapList();@MapKeyUpperCase
Page<HashMap<String, String>> queryMapByPage(RowBounds rb);

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/915855.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/915855.shtml
英文地址,請注明出處:http://en.pswp.cn/news/915855.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android Jetpack Compose + MVVM 開發流程深度分析

核心組件關系圖 [View] -- 觀察 --> [ViewModel] -- 操作 --> [Repository]| | Compose UI StateFlow/LiveData| | 用戶交互事件 Room/Retrofit| …

Tailwind CSS快速上手 Tailwind CSS的安裝、配置、使用

&#x1f4da;前言 在Web前端開發的歷史長河中&#xff0c;CSS的編寫方式經歷了多次演進&#xff0c;從早期的原生CSS 到 CSS預處理(Less/Sass/Stylus) 到 CSS-in-JS(Styled-Components/Emotion) 再到 Utility-First 原子化CSS。每一種演進方案其本質都是圍繞“開發效率”、“…

單例模式的智慧:從UVM看控制的藝術

有時候&#xff0c;生活中的很多東西其實只需要一個就夠了&#xff0c;就像一個公司只需要一個CEO&#xff0c;一個王朝只需要一個皇帝。在UVM驗證環境中&#xff0c;也有很多這樣的需求——有些對象&#xff0c;我們希望它在整個仿真過程中只存在一個實例。這就是我們今天要聊…

Hexo - 免費搭建個人博客01 - 安裝軟件工具

導言我的博客&#xff1a;https://q164129345.github.io/ Hexo 作為一個 Node.js 框架&#xff0c;它依賴于 Node.js 運行時環境來執行。 一、安裝Node.js官方網址&#xff1a;https://nodejs.org/zh-cn追求系統穩定性、可靠性以及希望減少維護頻率的用戶來說&#xff0c;LTS版…

【Kubernetes】集群啟動nginx,觀察端口映射,work節點使用kubectl配置

參考b站叩丁狼總結&#xff1a;完整版Kubernetes&#xff08;K8S&#xff09;全套入門微服務實戰項目&#xff0c;帶你一站式深入掌握K8S核心能力 在master節點執行 kubectl create deployment nginx --imagenginxkubectl expose deployment nginx --port80 --typeNodePort1. …

20250704-基于強化學習在云計算環境中的虛擬機資源調度研究

基于強化學習在云計算環境中的虛擬機資源調度研究 隨著云計算規模的持續擴大&#xff0c;數據中心虛擬機資源調度面臨動態負載、異構資源適配及多目標優化等挑戰。傳統啟發式算法在復雜場景下易陷入局部最優&#xff0c;而深度強化學習&#xff08;DRL&#xff09;憑借序貫決策…

day 33打卡

day 21 常見的降維算法 # 先運行之前預處理好的代碼 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns import warnings warnings.filterwarnings(ignore)# 設置中文字體 plt.rcParams[font.sans-serif] [SimHei] plt.rcParam…

sec(x)積分推導

在MATLAB中繪制 sec?(x)、cos(x) 和 ln?∣sec?(x)tan?(x)∣的函數圖像&#xff0c;需要特別注意 sec?(x) 在 cos?(x)0&#xff08;即 xπ/2kπ&#xff09;處的奇點。&#xff08;deepseek生成代碼&#xff09;% 定義x范圍&#xff08;-2π到2π&#xff09;&#xff0c;…

gpt面試題

vue面試題 &#x1f4a1; 一、響應式系統相關 ?1. Vue 3 的響應式系統是如何實現的&#xff1f;和 Vue 2 有何本質區別&#xff1f; 答案&#xff1a; Vue 3 使用 Proxy 實現響應式&#xff08;位于 vue/reactivity 模塊&#xff09;&#xff0c;替代 Vue 2 的 Object.defineP…

【基于OpenCV的圖像處理】圖像預處理之圖像色彩空間轉換以及圖像灰度化處理

目錄 零、寫在前面的話 一、圖像色彩空間轉換 1.1 RGB顏色空間 1.1.1 RGB顏色空間概念 1.1.2 RGB顏色模型?編輯 1.1.3 關于顏色加法 1.1.4 顏色加權加法 1.2 HSV顏色空間 1.2.1 HSV顏色空間概念 1.2.2 HSV顏色模型 1.2.3 應用意義 1.3 顏色轉換 1.3.1 轉換方法 …

Java TCP 通信詳解:從基礎到實戰,徹底掌握面向連接的網絡編程

作為一名 Java 開發工程師&#xff0c;你一定在實際開發中遇到過需要建立穩定連接、可靠傳輸、有序通信等場景。這時&#xff0c;TCP&#xff08;Transmission Control Protocol&#xff09; 通信就成為你必須掌握的重要技能之一。TCP 是一種面向連接、可靠、基于字節流的傳輸協…

HTML5 網頁游戲設計開發——1、HTML基礎

前言 互聯網上的應用程序被稱為Web程序&#xff0c;Web引用用程序是用Web文檔&#xff08;網頁&#xff09;累表現用戶界面&#xff0c;而Web文檔都遵守HTML格式。HTML5是最新的HTML標準。之前的版本HTML4.01于1999年發布&#xff0c;小20年過去了&#xff0c;互聯網已經發聲了…

opencv圖片標注

功能使用python opencv, 將文字信息標注在圖片中同一張圖片中涉及多次標注文字大小為標注框的0.3倍使用多綫程運行import cv2 import threading import numpy as npdef draw_annotations(item, annotations):"""在圖片上繪制標注框和文本annotations: 標注列表…

矩陣SVD分解計算

對于有數學庫的時候,進行矩陣相關計算還是不復雜,但是沒有數學庫就很麻煩,利用算法實現了矩陣奇異值分解。 void decompose(const std::vector<std::vector<double>>& A, std::vector<std::vector<double>>& U, std::vector<dou…

Flutter基礎(前端教程①⑦-Column豎直-Row水平-Warp包裹-Stack堆疊)

MainAxisAlignment 是一個枚舉類&#xff0c;用于控制主軸&#xff08;Main Axis&#xff09; 方向上子組件的排列和對齊方式。MainAxisAlignment 的常用取值及效果&#xff1a;MainAxisAlignment.start子組件沿主軸的起點對齊&#xff08;Row 左對齊&#xff0c;Column 頂部對…

構建智能視頻中樞--多路RTSP轉RTMP推送模塊在軌道交通與工業應用中的技術方案探究

1?? 行業背景與技術需求&#x1f688; 軌道交通行業對視頻監控的深度依賴在現代城市軌道交通系統中&#xff0c;視頻監控已不僅僅是安防的一部分&#xff0c;更是貫穿于運營管理、車輛調度、應急指揮和安全保障的核心技術手段。列車車載監控 ——列車上普遍部署多路高清攝像頭…

【Android Studio 2025 漢化教程】

廢話不多說&#xff0c;直接上干貨。 前提&#xff1a;JeBrains系列2025版已經集成中文插件&#xff0c;用戶不需下載&#xff0c;只要設置下即可&#xff0c;但Android Studio并不內置也不提供漢化插件。需要工具&#xff1a; 1.IDEA&#xff08;其他JeBrains系列也可以&#…

網絡安全初級(前端頁面的編寫分析)

源代碼index.html<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>登錄頁面</title><!--…

RAG項目實戰:LangChain 0.3集成 Milvus 2.5向量數據庫,構建大模型智能應用

項目背景 最近&#xff0c;有時間&#xff0c;想著動手實戰一下&#xff0c;從0到1搭建一個 RAG 系統&#xff0c;也是想通過實戰的方式來更進一步學習 RAG。因此&#xff0c;就定下了以項目實戰為主&#xff0c;書籍為輔的執行方式。&#xff08;書籍是黃佳老師著的《RAG 實戰…

docker build 和compose 學習筆記

目錄 docker build 筆記 1. 路徑解析 2. 關鍵注意事項 2. docker compose up -d 核心區別對比 常見工作流 補充說明 1. 功能區別 2. 協作關系 場景 1&#xff1a;Compose 自動調用 Build 場景 2&#xff1a;先 Build 后 Compose 3. 關鍵區別 4. 為什么需要協作&…