Oracle遷移到高斯查詢字段默認(rèn)小寫的解決辦法
一、問題說明
Oracle中,查詢結(jié)果字段默認(rèn)大寫。

高斯中,查詢結(jié)果字段默認(rèn)小寫。

在Mybatis的xml中,如果查詢語句使用Map接收查詢結(jié)果,使用resultType="java.util.HashMap"或resultType="Map"等寫法,返回的Map對象中,Key就是字段名,從Oracle遷移到高斯,大寫變成小寫,存在兼容性問題。
二、解決辦法
方案1、使用字段別名
當(dāng)代碼中使用Map接收查詢結(jié)果使用比較少時(shí),可以直接修改sql,通過為字段指定別名的方式,實(shí)現(xiàn)最終字段名為大寫,如上面演示的user_id AS "USER_ID"。
方案2、自定義Mybatis攔截器
通過mybatis攔截器實(shí)現(xiàn)查詢結(jié)果返回后,如果通過Map類型接收查詢結(jié)果,將Key轉(zhuǎn)為大寫。
1. 創(chuàng)建自定義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接收查詢結(jié)果,將Map的Key轉(zhuǎn)為大寫,解決從Oracle切換高斯后,高斯默認(rèn)小寫,JSP字段綁定異常,生成推送文件字段變化等問題
* {@link MapKeyUpperCase}
*/
@Intercepts({
@Signature(type = Executor.class, method = "query", args = {
MappedStatement.class, Object.class, RowBounds.class,
ResultHandler.class})})
public class MapKeyUpperCaseInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
// 執(zhí)行原方法,獲取返回結(jié)果
Object result = invocation.proceed();
// 獲取當(dāng)前執(zhí)行的Mapper方法,Executor.query的第一個(gè)參數(shù)為MappedStatement
MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
// 方法全路徑:com.example.mapper.UserMapper.selectUserMap
String 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)) {
// 返回結(jié)果是List,處理每一項(xiàng)
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 初始查詢結(jié)果
* @return java.util.HashMap<java.lang.Object, java.lang.Object>
* @desc 將Map接收的查詢結(jié)果的Key轉(zhuǎn)為大寫
*/
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;
}
@Override
public Object plugin(Object target) {
if (target instanceof Executor) {
return Plugin.wrap(target, this);
}
return target;
}
@Override
public void setProperties(Properties properties) {
}
}2. 創(chuàng)建自定義注解
import java.lang.annotation.*;
/**
* @desc 聲明在Mapper中以Map接收查詢結(jié)果的查詢方法上,標(biāo)明該方法返回字段名稱大寫
* {@link MapKeyUpperCaseInterceptor}
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MapKeyUpperCase {
}3. 注冊Mybatis攔截器
傳統(tǒng)方式,在mybatis-config.xml中注冊攔截器
<configuration>
<plugins>
<plugin interceptor="com.example.MapKeyUpperCaseInterceptor">
</plugin>
</plugins>
</configuration>在Springboot中注冊Mybatis攔截器,參考下面代碼
@Configuration
public class MyBatisConfig {
@Bean
public MapKeyUpperCaseInterceptor mapKeyUpperCaseInterceptor() {
return new MapKeyUpperCaseInterceptor();
}
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource, MapKeyUpperCaseInterceptor mapKeyUpperCaseInterceptor) throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
factoryBean.setPlugins(mapKeyUpperCaseInterceptor); // 注冊攔截器
return factoryBean.getObject();
}
}4. 在需要將Map中的Key轉(zhuǎn)為大寫的方法上,聲明自定義注解
在需要大寫的mapper方法上聲明該注解,實(shí)現(xiàn)返回Map對象Key是否大寫的配置,如
@MapKeyUpperCase Map<String, Object> getMap(); @MapKeyUpperCase List<Map<String, Object>> getMapList(); @MapKeyUpperCase Page<HashMap<String, String>> queryMapByPage(RowBounds rb);
到此這篇關(guān)于Oracle遷移到高斯,查詢字段默認(rèn)小寫,解決辦法的文章就介紹到這了,更多相關(guān)oracle查詢字段默認(rèn)小寫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Oracle設(shè)置時(shí)區(qū)和系統(tǒng)時(shí)間的多種實(shí)現(xiàn)方法
在Oracle數(shù)據(jù)庫中,設(shè)置時(shí)區(qū)和系統(tǒng)時(shí)間可以通過多種方法實(shí)現(xiàn),本文通過代碼示例給大家介紹了Oracle設(shè)置時(shí)區(qū)和系統(tǒng)時(shí)間的多種實(shí)現(xiàn)方法,需要的朋友可以參考下2024-02-02
如何在Oracle數(shù)據(jù)庫中更新CLOB字段
在Oracle數(shù)據(jù)庫中,Blob和Clob分別是兩種用來存儲大數(shù)據(jù)的字段類型,下面這篇文章主要給大家介紹了關(guān)于如何在Oracle數(shù)據(jù)庫中更新CLOB字段的相關(guān)資料,需要的朋友可以參考下2024-05-05
oracle—SQL技巧之(二)WMSYS.WM_CONCAT函數(shù)實(shí)現(xiàn)多行記錄用逗號拼接在一起
由于業(yè)務(wù)系統(tǒng)的交易記錄有很多,常常有些主管需要看到所有的記錄情況;又不想滾動;接下來介紹使用Oracle自帶的函數(shù) WMSYS.WM_CONCAT,進(jìn)行拼接,感興趣的朋友可以了解下2013-01-01
Oracle通過procedure調(diào)用webservice接口的全過程
存儲過程是一組為了完成特定功能的sql語句集合,經(jīng)過編譯后存儲在數(shù)據(jù)庫中,用戶通過制定存儲過程的名字并給出參數(shù)(如果該過程帶有參數(shù))來執(zhí)行他,本文介紹了Oracle通過procedure調(diào)用webservice接口的全過程,需要的朋友可以參考下2024-07-07
Oracle數(shù)據(jù)庫數(shù)據(jù)丟失恢復(fù)的幾種方法總結(jié)
相信大家無論是開發(fā)、測試還是運(yùn)維過程中,都可能會因?yàn)檎`操作、連錯數(shù)據(jù)庫、用錯用戶、語句條件有誤等原因,導(dǎo)致錯誤刪除、錯誤更新等問題。當(dāng)你捶胸頓足或嚇得腿軟時(shí),肯定希望有辦法來恢復(fù)這些數(shù)據(jù)。oracle就提供了一些強(qiáng)大的方法或機(jī)制,可以幫到有需要的你。2016-12-12
oracle中的substr()函數(shù)用法實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于oracle中substr()函數(shù)用法的相關(guān)資料,substr函數(shù)是用于字符串的截取的函數(shù),只適用于string類型,并不適用于字符數(shù)組,需要的朋友可以參考下2023-11-11

