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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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. 为什么需要协作&…