百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

信创改造-mysql迁移数据到人大金仓问题纪要(二)

cac55 2024-10-03 17:43 154 浏览 0 评论

1.date_format()函数 需要改成人大金仓支持的函数 to_date('2023-09-10', 'yyyy-mm-dd')

2. mybatis配置文件中存在list时,报错Unable to make public int java.util.Arrays$ArrayList.size()

配置如下:

<if test="educationDegree != null and educationDegree.size() > 0 ">
    and (education_degree in
         <foreach collection="educationDegree" item="item" open="(" close=")" separator=",">
            #{item}
        </foreach>)
</if>

报错如下:

### Error querying database. Cause: java.lang.reflect.InaccessibleObjectException: Unable to make public int java.util.Arrays$ArrayList.size() accessible: module java.base does not "opens java.util" to unnamed module @302c971f ### Cause: java.lang.reflect.InaccessibleObjectException: Unable to make public int java.util.Arrays$ArrayList.size() accessible: module java.base does not "opens java.util" to unnamed module @302c971f

解决方案:

<if test="educationDegree != null and !educationDegree.isEmpty">
    and (education_degree in
         <foreach collection="educationDegree" item="item" open="(" close=")" separator=",">
            #{item}
        </foreach>)
</if>

原因是ArrayList.size() 是java内部函数,mybatis如果要调用的话,需要加如下参数:

你可以通过修改JVM启动参数,强制Java模块系统开放所需的包。具体来说,可以在启动JVM时添加以下参数:

--add-opens java.base/java.util=ALL-UNNAMED

错误: 函数 CONCAT(bigint, bigint) 不是唯一的

配置如下:

<if test="typeList != null and !typeList.isEmpty ">
  and CONCAT(dbao.disability_category,dbao.disability_level) in
    <foreach collection="typeList" item="item" open="(" close=")" separator=",">
         #{item}
    </foreach>
</if>

这个错误提示表明Kingbase数据库无法确定使用哪个CONCAT函数来连接两个bigint类型的列。为了解决这个问题,你需要显式地将bigint类型的列转换为字符串类型,然后再进行连接。

解决方案:

你可以使用CAST函数将bigint类型的列转换为VARCHAR类型,然后再进行连接。以下是修改后的SQL语句:

<if test="typeList != null and !typeList.isEmpty ">
  and CONCAT(CAST(dbao.disability_category AS VARCHAR), CAST(dbao.disability_level AS VARCHAR)) in
    <foreach collection="typeList" item="item" open="(" close=")" separator=",">
         #{item}
    </foreach>
</if>

解决迁移数据后,主键冲突问题

现象:迁移数据后,由于未执行过nextval,所以首次执行只会获取最大的主键值并不会加一,从而导致冲突。

解决方案:

DO $

DECLARE

seq_name text;

schema_name text;

table_name text;

column_name text;

max_value bigint;

BEGIN

FOR seq_name, schema_name, table_name, column_name IN

SELECT c.relname AS sequence_name, n.nspname AS schema_name, t.relname AS table_name, a.attname AS column_name

FROM pg_class c

JOIN pg_sequence s ON c.oid = s.seqrelid

JOIN pg_namespace n ON c.relnamespace = n.oid

JOIN pg_depend d ON d.objid = c.oid AND d.deptype = 'a'

JOIN pg_class t ON d.refobjid = t.oid

JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = d.refobjsubid

WHERE c.relkind = 'S'

AND n.nspname NOT IN ('SYS_HM', 'other_restricted_schema') -- 添加其他受限模式

LOOP

BEGIN

-- 获取表的主键最大值

EXECUTE format('SELECT MAX(%I) FROM %I.%I', column_name, schema_name, table_name)

INTO max_value;

-- 如果表中没有数据,max_value 将为 NULL

IF max_value IS NULL THEN

max_value := 0;

END IF;

-- 设置序列的当前值为最大值加一

EXECUTE format('SELECT setval(''%I.%I'', %L)', schema_name, seq_name, max_value + 1);

RAISE NOTICE 'Sequence % in schema % set to %', seq_name, schema_name, max_value + 1;

EXCEPTION

WHEN undefined_table THEN

RAISE NOTICE 'Sequence % does not exist in schema %', seq_name, schema_name;

-- 创建缺失的序列

EXECUTE format('CREATE SEQUENCE %I.%I', schema_name, seq_name);

RAISE NOTICE 'Sequence % in schema % created', seq_name, schema_name;

END;

END LOOP;

END $;

在 Kingbase 中,::date 这种类型转换语法可能不被支持,导致的报错

报错现象:

Preparing: SELECT * FROM activity_user WHERE activity_start_time::date = CURRENT_DATE - 1 AND status = 1;

09:00:00.084 [quartzScheduler_Worker-1] ERROR c.a.d.f.s.StatFilter - [mergeSql,150] - merge sql error, dbType kingbase, druid-1.2.14, sql : SELECT *

FROM activity_user

WHERE activity_start_time::date = CURRENT_DATE - 1 AND status = 1;

问题分析:

Kingbase 数据库是基于 PostgreSQL 的,但可能在某些语法上有所不同。

在 Kingbase 中,::date 这种类型转换语法可能不被支持,或者需要使用不同的语法。你可以尝试使用 CAST 函数来进行类型转换,并确保日期计算的语法正确。

解决方案:

SELECT *

FROM disability_activity_user

WHERE CAST(activity_start_time AS DATE) = CURRENT_DATE - INTERVAL '1 day'

AND status = 1;

相关推荐

QQ表情大图(QQ表情大图怎么发)

爷青回 | QQ经典老头像(爷青回这个梗出自哪里)

点个关注不迷路记得点击上方关注我呦点击表情包长按可保存至手机表情包素材来源于网络,仅供分享哦拿完图记得吱一声点击下方分享、在看让更多人看到...

史上最全QQ官方经典头像全面翻新,不光高清还会动

每当看到上面这些头像,总能想起那些年的"轻舞飞扬","缘分天空","追风少年",这些已经模糊的头像给我们留下了太深的印象。这次为了纪念QQ20周年,腾讯官方整合了早期的105个经典头像,进行了全面翻...

QQ最全表情含义图解意思(qq表情含义图解最新 新版 文字)

QQ都不陌生吧!对QQ的表情符号含义你了解多少呢?在本文中最全图解233个表情所表达的含义,供有需人享用。用过QQ的人都晓得它的创始人是马化腾。QQ于1999年2月10日正式推出。QQ是腾讯公司开发的...

海联真人版QQ经典表情(海联真人版qq经典表情在哪)

海联版傲娇的说声“耶”狂拽炫酷就是我淑女应该轻言细语萌萌哒的娇羞哎哟喂小丫头片子机智如我吓死宝宝了欧巴卡几嘛~今天天气好晴朗怎么样?是不是很有趣呢拿起手机给自己拍几张萌萌哒的美照吧...

QQ音乐·音乐灵感独家对话金曲奖「最佳单曲制作人奖」得主JADE

JADE-AllRightJADE-差-点JADE-Goodbye,GoodbyeJADE-IAmLovefeat.乔瑟夫Chillseph下面请听本期灵感电台节目:本期博客...

亿万富豪爱泼斯坦狱中“自杀”,他背后的神秘女人出现在洛杉矶快餐店

爱泼斯坦在狱中离奇“自杀”,但他身负同谋指控的前女友、英国社交名媛希莱恩·麦克斯维尔(GhislaineMaxwell),却意外地出现在了洛杉矶街头平民快餐店,边啃着汉堡,咽着薯条,嘬着奶昔,边埋头...

扛起星战大旗的你们 觉得星战女需要换一身衣裳吗?

马上进入2016年,除了各种总结盘点以外,2016年的新看点也是需要科普一下了。目前最令人期待的应该就是《星球大战》回归了!《StarWars:原力觉醒》1月10日上映,博主不是电影评论员,所以不会...

和人对话的时候,我,最怕的就是,看到了自己内心的惶恐和脆弱

IWannaBeYourSlave(LiveFromGlobalCitizenLive2021),Maneskin很多时候,哪怕最甘于寂寞的人,也需要和人发生关联,需要和这个世界沟...

2024年度串烧完整版(搞笑失败尴尬丢人版)来了

一首APT的时间带你回顾你的2024年年度歌单。·1.《免我蹉跎苦》黄龄。·2.《红昭愿》音阙诗听。·3.《苹果香》狼戈。·4.《免我蹉跎苦》黄龄。·5.《红昭愿》音阙诗听。·6.《苹果香》狼戈。·7...

一课译词:打工人(打工人的翻译)

下午好,各位打工人!近日,“打工人”爆红网络,受到各行各业年轻人的追捧,但这词到底说的是个啥?“打工人”是那些依靠体力或技术的劳动者的统称。除了赚钱这个最大的目标,别的啥也不想;他们意志坚定,也不会迟...

初级词汇题(一)柏拉图指出不是每个孩子都适合上学,你赞成吗?

初级词汇题(一)柏拉图在《理想国》中指出不是每个孩子都适合上学,你赞成吗?今天分享的题目是我基于英文原著改编的初级词汇题A开头的第81道题。背景知识拓展:什么是nativist(先天论者)?什么是哲学...

治愈系英文:每个说不想恋爱的人,心里都装着一个无法拥有的人

Therearesomanypeopleouttherewhowilltellyouthatyoucan't.Whatyou'vegottodoisturna...

首首经典!意大利流行乐队Maneskin作品I WANNA BE YOUR SLAVE

手机点击试听(上边)Maneskin是一支来自罗马的意大利流行摇滚乐队,由主唱DamianoDavid、贝斯手VictoriaDeAngelis、吉他手ThomasRaggi和鼓手...

国家电网新一代电子商务平台投标文件双层PDF制作最全教程

投标知识在招投标过程中,我们经常碰见有些文件要求制成双层PDF格式,那么双层PDF是什么呢?怎么制作呢?今天就给大家普及下。定义双层PDF双层PDF格式文件是一种具有多层结构的PDF格式文件,是PD...

取消回复欢迎 发表评论: