业务说明
对应的业务需求
每个X对应的每项Y的Z值,将Y作为行纬度将X作列纬度展示Z的值
举例:已知每个学生对应的每道题的得分 二纬表,转换为每道题每个学生的得分二纬表。
hibernate 查询sql对应的代码
String _sql = "select id, pm, yhdm, name, df from Student_Score";
//表说明:
//Student_Score 每个学生每道题目的得分明细表
//id 为Student_Score 主键列
//pm 题目表的外键
//yhdm 学生表的外键
//name 学生表中的名称(此处可以用自查询获取对应的名称)
//df 学生对应题目的得分
private List<Map<String, Object>> loadTableData(String _sql){
HibernateSession sess = HibernateSessionFactory.getSession(this.getClass());
return sess.createSQLQuery(_sql).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list();
}
查询出的结果如下:
|id: 100 |pm: 1 | name:张三 |yhdm:1 | df:11 |
|id: 101 |pm: 2 | name:张三 |yhdm:1 | df:12 |
|id: 102 |pm: 3 | name:张三 |yhdm:1 | df:13 |
|id: 103 |pm: 1 | name:李四 |yhdm:2 | df:21 |
|id: 104 |pm: 2 | name:李四 |yhdm:2 | df:22 |
|id: 105 |pm: 3 | name:李四 |yhdm:2 | df:23 |
|id: 106 |pm: 1 | name:王武 |yhdm:3 | df:31 |
|id: 107 |pm: 2 | name:王武 |yhdm:3 | df:32 |
|id: 108 |pm: 3 | name:王武 |yhdm:4 | df:33 |
执行转换后如下:
返回结果key设计说明
yhdm_2-df : 放入了原始表中的 yhdm 的 key_val 组合
yhdm_3-id:放入了原始表中的 yhdm 的 key_val 组合
已上两个key 只要在一行,就能通过 替换"-"后面的 df 与 id ,从而找到 此df对应的val在原始表中的唯一位置。
pm : 转换后行的唯一值
| yhdm_2-df : 李四 || yhdm_1-df : 张三 || yhdm_3-df : 王武 |
--------------
| yhdm_2-df : 21 || yhdm_1-df : 11 || yhdm_3-df : 31 || yhdm_3-id : 106 || yhdm_2-id : 103 || pm : 1 || yhdm_1-id : 100 |
--------------
| yhdm_2-df : 22 || yhdm_1-df : 11 || yhdm_3-df : 32 || yhdm_3-id : 107 || yhdm_2-id : 104 || pm : 2 || yhdm_1-id : 101 |
--------------
| yhdm_2-df : 23 || yhdm_1-df : 11 || yhdm_3-df : 33 || yhdm_3-id : 108 || yhdm_2-id : 105 || pm : 3 || yhdm_1-id : 102 |
--------------
使用
创建Java文件 Utils.java
在项目跟目录,没有包 复制代码可直接运行 main方法
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Utils {
public static List<Map<String, Object>> row_to_column_keyUp(List<Map<String, Object>> sourceData, String sourceIdKey,String sourceOneKey, String sourceTwoKeyInt, String sourceTwoKeyStr, String sourceLastKey){
return row_to_column(sourceData, sourceIdKey.toUpperCase(), sourceOneKey.toUpperCase(), sourceTwoKeyInt.toUpperCase(), sourceTwoKeyStr.toUpperCase(), sourceLastKey.toUpperCase());
}
/**
* 行列转换
* 转换前
* |id: 100|pm: 1 | name:张三 |yhdm:1 | df:11 |
* |id: 101|pm: 2 | name:张三 |yhdm:1 | df:12 |
* |id: 102|pm: 3 | name:张三 |yhdm:1 | df:13 |
* |id: 103|pm: 1 | name:李四 |yhdm:2 | df:21 |
* |id: 104|pm: 2 | name:李四 |yhdm:2 | df:22 |
* |id: 105|pm: 3 | name:李四 |yhdm:2 | df:23 |
* |id: 106|pm: 1 | name:王武 |yhdm:3 | df:31 |
* |id: 107|pm: 2 | name:王武 |yhdm:3 | df:32 |
* |id: 108|pm: 3 | name:王武 |yhdm:4 | df:33 |
* 转换后
* | yhdm_1-df:张三 | yhdm_2-df:李四 | yhdm_3-df:王武 |
* | pm:1 | yhdm_1-id:100 |yhdm_1-df:11 | yhdm_2-id:103 | yhdm_2-df:21 | yhdm_3-id:106 | yhdm_3-df:31 |
* | pm:2 | yhdm_1-id:102 |yhdm_1-df:12 | yhdm_2-id:104 | yhdm_2-df:22 | yhdm_3-id:107 | yhdm_3-df:32 |
* | pm:3 | yhdm_1-id:103 |yhdm_1-df:13 | yhdm_2-id:105 | yhdm_2-df:23 | yhdm_3-id:108 | yhdm_3-df:33 |
* @return
*/
public static List<Map<String, Object>> row_to_column(List<Map<String, Object>> sourceData, String sourceIdKey,String sourceOneKey, String sourceTwoKeyInt, String sourceTwoKeyStr, String sourceLastKey){
List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
Map<String, Object> one_row_map_result = new HashMap<String , Object>();
// one_row_map_result.put(sourceOneKey + sourceTwoKeyInt, "-");
for(Map<String, Object> source_map : sourceData){
String oneKeyValue = sourceOneKey + "_" + source_map.get(sourceOneKey);
String twoKeyIndexValue = sourceTwoKeyInt + "_" + source_map.get(sourceTwoKeyInt);
String idKeyValue = sourceIdKey + "_" + source_map.get(sourceIdKey);
//判断返回结果第一行是否已存在对应的转换key yhdm_1-df:张三
String one_row_key_result = twoKeyIndexValue + "-" + sourceLastKey;
if(!one_row_map_result.containsKey(one_row_key_result)){
//返回结果 第一行添加
one_row_map_result.put(one_row_key_result, source_map.get(sourceTwoKeyStr));
}
Map<String, Object> row_map_result = new HashMap<String , Object>();
//返回结果中 是否已存在对应的key值
int mapIndex = getMayIndex(result, sourceOneKey, source_map.get(sourceOneKey));
if( mapIndex != -1){
//存在,获取到对应的index
row_map_result = result.get(mapIndex);
}else{
//不存在
row_map_result.put(sourceOneKey, source_map.get(sourceOneKey));
}
//数据单元格的id yhdm_1-id:100
String row_key_result = twoKeyIndexValue + "-" + sourceIdKey;
if(!row_map_result.containsKey(row_key_result)){
row_map_result.put(row_key_result, source_map.get(sourceIdKey));
}
//数据单元格的值 yhdm_1-df:11
if(!row_map_result.containsKey(one_row_key_result)){
row_map_result.put(one_row_key_result, source_map.get(sourceLastKey));
}
//返回结果不存在添加数据
if( mapIndex == -1){
result.add(row_map_result);
}
}
//插入第一行数据
result.add( 0, one_row_map_result);
return result;
}
/**
* list 中已存在对应key的值
* @param datas
* @param key
* @param value
* @return 集合所在位置索引 或 -1
*/
public static int getMayIndex(List<Map<String, Object>> datas, String key, Object value){
for(int i = 0; i < datas.size(); i++){
Map<String, Object> _data = datas.get(i);
//返回值中已经存在对应的key
if(value == null){
return -1;
}
if(value.equals(_data.get(key))){
return i;
}
}
return -1;
}
/**
* |id: 100 |pm: 1 | name:张三 |yhdm:1 | df:11 |
* |id: 101 |pm: 2 | name:张三 |yhdm:1 | df:12 |
* |id: 102 |pm: 3 | name:张三 |yhdm:1 | df:13 |
* |id: 103 |pm: 1 | name:李四 |yhdm:2 | df:21 |
* |id: 104 |pm: 2 | name:李四 |yhdm:2 | df:22 |
* |id: 105 |pm: 3 | name:李四 |yhdm:2 | df:23 |
* |id: 106 |pm: 1 | name:王武 |yhdm:3 | df:31 |
* |id: 107 |pm: 2 | name:王武 |yhdm:3 | df:32 |
* |id: 108 |pm: 3 | name:王武 |yhdm:4 | df:33 |
* @param args
*/
public static void main(String[] args) {
List<Map<String, Object>> datas = new ArrayList<>();
Map<String, Object> t1 = new HashMap<String, Object>();
t1.put("id", 100);
t1.put("pm", 1);
t1.put("name", "张三");
t1.put("yhdm", "1");
t1.put("df", "11");
datas.add(t1);
Map<String, Object> t2 = new HashMap<String, Object>();
t2.put("id", 101);
t2.put("pm", 2);
t2.put("name", "张三");
t2.put("yhdm", "1");
t2.put("df", "11");
datas.add(t2);
Map<String, Object> t3 = new HashMap<String, Object>();
t3.put("id", 102);
t3.put("pm", 3);
t3.put("name", "张三");
t3.put("yhdm", "1");
t3.put("df", "11");
datas.add(t3);
Map<String, Object> t4 = new HashMap<String, Object>();
t4.put("id", 103);
t4.put("pm", 1);
t4.put("name", "李四");
t4.put("yhdm", "2");
t4.put("df", "21");
datas.add(t4);
Map<String, Object> t5 = new HashMap<String, Object>();
t5.put("id", 104);
t5.put("pm", 2);
t5.put("name", "李四");
t5.put("yhdm", "2");
t5.put("df", "22");
datas.add(t5);
Map<String, Object> t6 = new HashMap<String, Object>();
t6.put("id", 105);
t6.put("pm", 3);
t6.put("name", "李四");
t6.put("yhdm", "2");
t6.put("df", "23");
datas.add(t6);
Map<String, Object> t7 = new HashMap<String, Object>();
t7.put("id", 106);
t7.put("pm", 1);
t7.put("name", "王武");
t7.put("yhdm", "3");
t7.put("df", "31");
datas.add(t7);
Map<String, Object> t8 = new HashMap<String, Object>();
t8.put("id", 107);
t8.put("pm", 2);
t8.put("name", "王武");
t8.put("yhdm", "3");
t8.put("df", "32");
datas.add(t8);
Map<String, Object> t9 = new HashMap<String, Object>();
t9.put("id", 108);
t9.put("pm", 3);
t9.put("name", "王武");
t9.put("yhdm", "3");
t9.put("df", "33");
datas.add(t9);
List<Map<String, Object>> result = row_to_column(datas, "id","pm", "yhdm", "name", "df");
for(Map<String, Object> map : result){
for(String key:map.keySet()){//keySet获取map集合key的集合 然后在遍历key即可
String value = map.get(key).toString();//
System.out.print("| "+ key +" : "+ value +" |");
}
System.out.println("");
System.out.println("--------------");
}
}
}
main执行结果
| yhdm_2-df : 李四 || yhdm_1-df : 张三 || yhdm_3-df : 王武 |
--------------
| yhdm_2-df : 21 || yhdm_1-df : 11 || yhdm_3-df : 31 || yhdm_3-id : 106 || yhdm_2-id : 103 || pm : 1 || yhdm_1-id : 100 |
--------------
| yhdm_2-df : 22 || yhdm_1-df : 11 || yhdm_3-df : 32 || yhdm_3-id : 107 || yhdm_2-id : 104 || pm : 2 || yhdm_1-id : 101 |
--------------
| yhdm_2-df : 23 || yhdm_1-df : 11 || yhdm_3-df : 33 || yhdm_3-id : 108 || yhdm_2-id : 105 || pm : 3 || yhdm_1-id : 102 |
--------------