hibernate查询结果行转列

业务说明

对应的业务需求
每个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 |
--------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值