首页 > 编程语言 >存储动态列的结果集(行列互转)--java、mybatis、orcale

存储动态列的结果集(行列互转)--java、mybatis、orcale

时间:2023-03-29 13:46:42浏览次数:34  
标签:java -- 列名 value col key 互转 table id

业务上需要存储动态列的数据 通过行列互转的方式实现

数据库中动态列的几种设计思路

  • 使用数据库DDL进行动态创建

  • 使用数据库预留字段(宽表)

  • 使用数据库中的json数据类型

  • 使用非关系型数据库(MongoDB等)

这是网上给出的几个基本思路,考虑到我们业务上的功能不太适合这些方法,所有最后选择通过行列互转的方式实现。

数据库设计

数据库使用了4个字段,key是原表中的列名,value是对应的值,sort有两个作用,排序和分组,row_id用于关联主表。数据库结构如下表table

名称 类型 注释
COL_KEY VARCHAR2(50) 列名(key)
COL_VALUE VARCHAR2(255) 列值(value)
ROW_ID VARCHAR2(50) 所属主表id
SORT NUMBER 排序

行转列(存储)

第一步是将动态列的结果集存储起来

列名1 列名2 列名3 ... 列名N
a b c ... e
1 2 3 ... 5
A B C ... E
6 7 8 ... 10

结果集返回的数据是List<Map> 结构,这里不做太多赘述了

直接上代码

//存入列表(列转行)
List<Table> list= new ArrayList<>();//新建一个table类型的集合
long index = 1;//排序索引
for (Map map : list) { //list是返回的结果集,直接遍历
    // 通过keySet方法获取list中一个map的所有key
    Set<String> keySet = map.keySet(); 
    for (String s : keySet) { //继续遍历所有key
        //新建临时对象
        Table table = new Table();
        table.setColKey(s);//设置属性Key
        //设置属性value,通过get(key)的方式,同时将value的类型都处理成String
        table.setColValue(String.valueOf( map.get(s)));
        table.setSort(index);//设置分组条件的同时还能排序
        table.setRowId(“自定义”);//根据传过来的值设置属于那个主表
        list.add(table);//加入集合中
    }
    index++;
}

列转行(显示)

假设上一步已经将数据存入table表中

col_key col_value row_id sort
列名1 a id 1
列名1 a id 1
列名1 a id 1
列名1 a id 1
列名1 a id 1
列名1 a id 1
列名1 a id 1
列名1 a id 1
1 2 3 ...
A B C ...
6 7 8 ...

存完之后下一步就该显示了,虽然我们是通过列的方式存的,但是我们显示的时候还是应该将列转换成行来显示,就和存之前的结果集一样

我用的数据库是Oracle,因此有两种方式来实现

SQL通用方式

select sort,
MAX(case col_key when '状态' then col_value  end) as AAA,
MAX(case col_key when '创建者' then col_value  end) as AAA,  
MAX(case col_key when '编号' then col_value  end) as AAA,
MAX(case col_key when '类型' then col_value  end) as AAA
from monitor_detail 
where monitor_id = 235 
group by sort order by sort

标签:java,--,列名,value,col,key,互转,table,id
From: https://www.cnblogs.com/Cloong/p/17268281.html

相关文章

  • 转载:PageOffice 在线编辑 office文件,回调父页面
    一、子页面调用父页面的方法varvalue=window.external.CallParentFunc("ParentFunName(Arguments);");//父页面的JS函数有返回值window.external.CallParentFunc("......
  • IntelliJ IDEA编译项目报错 "xxx包不存在" 或 "找不到符号" 问题
    IntelliJIDEA编译项目报错"xxx包不存在"或"找不到符号"1.maven设置首先查看maven设置,不要使用默认的maven版本:3.8.52.Maven-Reimport3.UTF-8编码选择设置为UTF-......
  • linux和windows下换行符引起的报错——dos2unix转换
    有时候由于有的代码太长,显示的时候看着很不舒服,所以在编写的时候会加上\再换行,这个是转义字符(转义字符还是编译字符??我对这个不是很了解。。。),到时候会把换行符给变成空格(我......
  • 又是Android studio下layout文件内容无提示
     又出现没有提示的问题。只不过这次我新建了一个模块。想想可能是模块的问题    之前是32,先在新建的是33.更改回32即可。 ......
  • 信息隐藏和局部化
    信息隐藏和局部化是软件工程中的重要概念,可以提高软件的模块化程度和独立性。以下是关于信息隐藏和局部化的详细解释和作用:a.信息隐藏:指设计和确定模块时,使得一个模块内包......
  • 使用SSH连接局域网内的WSL Ubuntu
    参考:https://zhuanlan.zhihu.com/p/586283483https://www.cnblogs.com/lidabo/p/16855975.html  ==========================================  根据https://z......
  • test3-with-pic-debug
    Markdown示例文件这是一个加粗的文本。这是一个斜体的文本。这是一个~~删除线~~的文本。标题H1标题H2标题H3标题H4标题H5标题H6这是一个引用。这是一个......
  • 字符串函数_Linux_python_R_SQL
    字符串处理grep查找命令筛选信息awkcut按照指定要求分割-awk截取列信息cut截取字符串信息awkFS对第一行没作用要用大写的BEGIN方法01.利用exp......
  • css列数自适应的grid布局
    近期做项目,遇到了一点样式上的问题,理论上通过直接改/嵌套一层来解决比较容易,但实际上,数据结构没我想象中的简单具体例子如下:demo期望效果: ......
  • 一个让程序员可能失业的插件Copilot,在Visual Studio 中的使用
    首先来看看什么是Copilot,Copilot是GitHub去年联合OpenAI,推出了一款智能工具,全名是“GitHubCopilot”,可以根据上下文自动写代码,将程序员从重复的编写中解放出来。比如让C......