PostgreSQL表中字段由字符串改为数组

需求:PostgreSQL数据库中的一张表的某些字段,之前存的是字符串,由于业务需求变更,需要存储多条数据,字段类型要改为数组,并保留原来的数据。

具体实现:

  1. 修改表中字段类型:把 etl_flow_template 表中的 protocol_document_path_list字段和 protocol_document_file_name_list 字段修改为数组类型,并保留原来的值:
    alter table etl_flow_template alter column protocol_document_path_list type text[] using array[protocol_document_path_list]::text[];
    
    alter table etl_flow_template alter column protocol_document_file_name_list type text[] using array[protocol_document_file_name_list]::text[];

    修改后表中字段效果:

  2. 修改映射文件中数据类型:
    <resultMap id="BaseResultMap" type="com.hikvision.idatafusion.hdiwebsite.dto.template.TemplateView">
            <id column="id" jdbcType="BIGINT" property="id"/>
            <result column="template_name" jdbcType="VARCHAR" property="templateName"/>
            <result column="icon_path" jdbcType="VARCHAR" property="iconPath"/>
            <result column="template_path" jdbcType="VARCHAR" property="templatePath"/>
            <result column="template_file_name" jdbcType="VARCHAR" property="templateFileName"/>
            <result column="protocol_document_path_list" jdbcType="VARCHAR" property="protocolDocumentPathList"
                    typeHandler="com.hikvision.idatafusion.dhidata.commons.typeHandler.ArrayTypeHandlerPg"/>
            <result column="protocol_document_file_name_list" jdbcType="VARCHAR" property="protocolDocumentFileNameList"
                    typeHandler="com.hikvision.idatafusion.dhidata.commons.typeHandler.ArrayTypeHandlerPg"/>
    </resultMap>
    其中 ArrayTypeHandlerPg 是转换的工具类:
    public class ArrayTypeHandlerPg implements TypeHandler<List<?>> {
    
        @Override
        public void setParameter(PreparedStatement ps, int i, List<?> parameter, JdbcType jdbcType) throws SQLException {
            //用于pg数组
            if (parameter == null) {
                try {
                    ps.setNull(i, JdbcType.ARRAY.TYPE_CODE);
                } catch (SQLException e) {
                    throw new TypeException("Error setting null for parameter #" + i + " with JdbcType " + jdbcType + " . "
                            + "Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. "
                            + "Cause: " + e, e);
                }
            } else {
                try {
                    ps.setArray(i, ps.getConnection().createArrayOf(jdbcType.name(), parameter.toArray()));
                } catch (Exception e) {
                    throw new TypeException("Error setting non null for parameter #" + i + " with JdbcType " + jdbcType
                            + " . "
                            + "Try setting a different JdbcType for this parameter or a different configuration property. "
                            + "Cause: " + e, e);
                }
            }
        }
    
        @Override
        public List<?> getResult(ResultSet rs, String columnName) throws SQLException {
            List<?> result;
            try {
                Array array = rs.getArray(columnName);
                result = array == null ? null : new ArrayList<>(Arrays.asList((Object[]) array.getArray()));
            } catch (Exception e) {
                throw new ResultMapException(
                        "Error attempting to get column '" + columnName + "' from result list.  Cause: " + e, e);
            }
            if (rs.wasNull()) {
                return null;
            } else {
                return result;
            }
        }
    
        @Override
        public List<?> getResult(ResultSet rs, int columnIndex) throws SQLException {
            List<?> result;
            try {
                Array array = rs.getArray(columnIndex);
                result = array == null ? null : new ArrayList<>(Arrays.asList((Object[]) array.getArray()));
            } catch (Exception e) {
                throw new ResultMapException(
                        "Error attempting to get column #" + columnIndex + " from result list.  Cause: " + e, e);
            }
            if (rs.wasNull()) {
                return null;
            } else {
                return result;
            }
        }
    
        @Override
        public List<?> getResult(CallableStatement cs, int columnIndex) throws SQLException {
            List<?> result;
            try {
                Array array = cs.getArray(columnIndex);
                result = array == null ? null : new ArrayList<>(Arrays.asList((Object[]) array.getArray()));
            } catch (Exception e) {
                throw new ResultMapException(
                        "Error attempting to get column #" + columnIndex + " from callable statement.  Cause: " + e, e);
            }
            if (cs.wasNull()) {
                return null;
            } else {
                return result;
            }
        }
    }
  3. 修改增删改查数据sql语句:
    增、查时,resultMap 引用上面的映射文件的 BaseResultMap 便可 resultMap="BaseResultMap",改时需要注意进行转换:
    <update id="updateProtocolData" parameterType="com.hikvision.idatafusion.hdiwebsite.model.EtlFlowTemplate">
            update etl_flow_template set
            <if test="protocolNames != null and protocolNames.size() > 0">
                protocol_document_file_name_list = #{protocolNames, jdbcType=VARCHAR, typeHandler=com.hikvision.idatafusion.dhidata.commons.typeHandler.ArrayTypeHandlerPg},
            </if>
            <if test="protocolPaths != null and protocolPaths.size() > 0">
                protocol_document_path_list = #{protocolPaths, jdbcType=VARCHAR, typeHandler=com.hikvision.idatafusion.dhidata.commons.typeHandler.ArrayTypeHandlerPg}
            </if>
            where id = #{templateId}
    </update>

     

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/260358.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

全功能知识付费小程序系统源码是什么?有什么好处?

全功能知识付费小程序系统源码&#xff0c;是一个集课程管理、用户管理、支付管理、数据分析等于一体的综合性解决方案。它支持多种形式的课程内容&#xff0c;如视频、音频、图文等&#xff0c;满足不同用户的学习需求。同时&#xff0c;系统具备完善的支付功能&#xff0c;保…

Panoply查看nc文件的时间维

打开的是全球灌溉农田灌溉用水量遥感估算数据集&#xff08;2011-2018&#xff09;&#xff0c;该文件以nc格式储存。nc格式文件就是一个多维的数据库。经纬度占了两维&#xff0c;可能还有时间维度&#xff0c;就是时空谱。 双击打开刚打开时只能看到2018年1月的灌溉数据 打…

快猫视频模板源码定制开发 苹果CMS 可打包成双端APP

苹果CMS快猫视频网站模板源码&#xff0c;可用于开发双端APP&#xff0c;后台支持自定义参数&#xff0c;包括会员升级页面、视频、演员、专题、收藏和会员系统等完整模块。还可以直接指定某个分类下的视频为免费专区&#xff0c;具备完善的卡密支付体系&#xff0c;无需人工管…

数合建模功能清单

在百度搜索 ”数合建模及可视化“&#xff0c;进入官网网站&#xff0c;有更详细的说明

k8s 中部署Jenkins

创建namespace apiVersion: v1 kind: Namespace metadata:name: jenkins创建pv以及pvc kind: PersistentVolume apiVersion: v1 metadata:name: jenkins-pv-volumenamespace: jenkinslabels:type: localapp: jenkins spec:#storageClassName: manualcapacity:storage: 5Giacc…

mysql部署 --(docker)

先查找MySQL 镜像 Docker search mysql &#xff1b; 拉取mysql镜像&#xff0c;默认拉取最新的&#xff1b; 创建mysql容器&#xff0c;-p 代表端口映射&#xff0c;格式为 宿主机端口&#xff1a;容器运行端口 -e 代表添加环境变量&#xff0c;MYSQL_ROOT_PASSWORD是root用户…

ACE Tools环境配置指导

ACE Tools环境配置指导 简介&#xff1a; ACE Tools是一套为ArkUI-X应用开发者提供的命令行工具&#xff0c;支持在Windows/Ubuntu/macOS平台运行&#xff0c;用于构建OpenHarmony、HarmonyOS、Android和iOS平台的应用程序&#xff0c; 其功能包括开发环境检查&#xff0c;新建…

中缀表达式求值

中缀表达式是一种常见的数学表达式表示方法&#xff0c;它将操作符放在两个操作数的中间。例如&#xff0c;中缀表达式 "2 3" 表示将两个数相加。 中缀表达式求值的一般算法如下&#xff1a; 建立一个栈&#xff0c;用于存储操作数和运算符。从左到右扫描中缀表达…

如何做好买货查窜货这件事

窜货是大多数品牌都会遇到的渠道问题&#xff0c;店铺窜货是为了更多的利润空间&#xff0c;所以窜货还会伴随低价&#xff0c;治理窜货是品牌的义务&#xff0c;更是品牌的责任&#xff0c;品牌在管控渠道时应配合一套完整的控价流程&#xff0c;治理窜货也不例外&#xff0c;…

Vue 官方周报 #124 - 使用JSDoc记录组件属性

Hi &#x1f44b; 当你将鼠标悬停在IDE中的组件上时&#xff0c;显示组件属性所对应的描述&#xff0c;这个功能在开发过程中会很有用。你可以在传递给defineProps函数的TypeScript接口中使用JSDoc来实现这一点&#xff1a; MyComponent.vue <script setup lang"ts&…

Java 并发编程 —— Fork/Join 框架的原理详解

目录 一. 前言 二. 并发和并行 2.1. 并发 2.2. 并行 2.3. 分治法 三. ForkJoin 并行处理框架的理论 3.1. ForkJoin 框架概述 3.2. ForkJoin 框架原理 3.3. 工作窃取算法 四. ForkJoin 并行处理框架的实现 4.1. ForkJoinPool 类 4.2. ForkJoinWorkerThread 类 4.3.…

大华 DSS 城市安防数字监控系统 SQL 注入漏洞

漏洞简介 大华DSS数字监控系统itcBulletin接口对传入的数据没有预编译和充足的校验&#xff0c;导致该接口存在SQL注入漏洞&#xff0c;可通过注入漏洞获取数据库敏感信息。 资产测绘 app“dahua-DSS” 漏洞复现 POC: POST /portal/services/itcBulletin?wsdl HTTP/1.1 H…

图卷积神经网络发展

1. 图神经网络&#xff08;GNN&#xff09; 图神经网络的概念最早在2005年提出。2009年Franco博士在其论文 [2]中定义了图神经网络的理论基础。 本文中所提到的图均指图论中的图(Graph)。它是一种由若干个结点(Node)及连接两个结点的边(Edge)所构成的图形&#xff0c;用于刻画…

从源码到实践:深入了解鸿鹄电子招投标系统与电子招投标

在数字化采购领域&#xff0c;企业需要一个高效、透明和规范的管理系统。通过采用Spring Cloud、Spring Boot2、Mybatis等先进技术&#xff0c;我们打造了全过程数字化采购管理平台。该平台具备内外协同的能力&#xff0c;通过待办消息、招标公告、中标公告和信息发布等功能模块…

eslint严格规则检测问题报错

由于eslint严格规则检测问题报错时&#xff0c;更改两个文件package.json和vue.config.js package.json "no-unused-components": "off" vue.config.js lintOnSave: false 更改完成之后&#xff0c;重新run一下就OK了

DC电源模块在工业自动化中的关键应用案例分析

BOSHIDA DC电源模块在工业自动化中的关键应用案例分析 DC电源模块在工业自动化中有许多关键应用案例&#xff0c;以下是其中的一些&#xff1a; 1. 电机控制系统&#xff1a;在工业自动化中&#xff0c;电机控制是非常常见的应用。DC电源模块用于为电机提供稳定的直流电源&…

25考研指导规划建议(内含宝典级资料)

句句肺腑&#x1f4aa; &#x1f4cc;1.没有导师不喜欢要英语好的学生。四六级报名咨询查询链接 普通大学生至少要拿到四级证书四级真题和资料&#xff0c;有解析包括听力 &#x1f4cc;2.政治开始越早&#xff0c;离上岸越远 &#x1f4cc;3.每年7、8月是弃考高峰、11月再弃…

聪明高效能力广,AGI如何赋能内容管理?

文 | 智能相对论 作者 | 叶远风 毫无疑问&#xff0c;现在的大模型在技术比拼之外&#xff0c;如何通过产品化的方式走入到实际业务&#xff0c;是各厂商的着力点。 而一些一贯与数字化场景紧密融合的服务厂商&#xff0c;在大模型浪潮一开始就已经走在落地一线。 大数据基…

mysql使用全文索引+ngram全文解析器进行全文检索

表结构&#xff1a;表名 gamedb 主键 id 问题类型 type 问题 issue 答案 answer 需求 现在有个游戏资料库储存在mysql中&#xff0c;客户端进行搜索&#xff0c;需要对三个字段进行匹配&#xff0c;得到三个字段的相关性&#xff0c;选出三个字段中相关性最大的值进…

基于alibaba druid的血缘解析工具

基于alibaba druid的血缘解析 1、前言 仅仅对mysql数据库的select查询语句进行了血缘解析&#xff0c;该血缘解析包含了原始表字段、临时表字段和目标表字段的关联关系。 2、涉及到技术 主要使用了druid的如下接口对语法树进行解析&#xff1a; &#xff08;1&#xff09;…