zoukankan      html  css  js  c++  java
  • jpa中将查询的字段返回为Map键值对类型

    由于最近的一个项目技术选型用了JPA,在使用过程中,感觉JPA对Map这种类型着实有点不兼容。

    问题:只想查询表中个别字段,并将这些字段封装为键值对map的形式返回给前端

    sql语句:select b.userid,b.truename from WcmAppuser b where b.userid in (1,2,3);

    如果对返回的结果不做任何处理,返回的结果是这样的:

    [
        [
            1,
            "张三"
        ],
        [
            2,
            "李四"
        ],
        [
            3,
            "王二"
        ]
    ]

    但是,这明显不是我想要的结果,我理想中的结果应该是这样的:

    [
        {
            "userid":1,
            "truename": "张三"
        },
        {
            "userid":2,
            "truename": "李四"
        },
        {
            "userid":3,
            "truename": "王二"
        },
    ]

    所以我一直在搜 JPA 怎样能把返回的结果装配成这种,但是一直没有搜到我想要的结果。直到我发现自己走进去了一个误区,我一直在想怎么将 list 转换为Map,

    但是转为 map 之后,每一个字段又都是游离的,不能像存放一个 Object 一样。我忽然意识到一种办法,List--->Map--->List,下面直接上代码。

    List list = null;
    List<Object> arrayList = null;
    StringBuffer sql = new StringBuffer("select b.userid,b.truename from WcmAppuser b where b.userid in (");
                    for (int i=0;i<n.length;i++){
                        if(i == n.length-1){
                            sql.append(n[i]);
                            sql.append(")");
                        }else {
                            sql.append(n[i]);
                            sql.append(",");
                        }
                    }
                    Query query = entityManager.createNativeQuery(String.valueOf(sql));
                    list = query.getResultList();
    //这上面的代码可以不用看,只是 JPA 对in的兼容也不是很好,所以我使用了nativeSql
                    arrayList = new ArrayList<>();
                    for (Object obj : list) {
                        Map<String, Object> map = new HashMap<>(); //这个Map一定要放在循环里面,如果放在循环外面,你add进去的map指向的是同一个内存地址,不管你add进去多少次,数据都是一样的。
                        Object[] arr = (Object[]) obj;
                        map.put("userid",arr[0]);
                        map.put("truename",arr[1]);
                        arrayList.add(map);
                    }

    足厚返回的结果:

    {
      "code": "0",
      "msg": "接口调用成功",
      "data": [
        {
          "truename": "李四",
          "userid": 1
        },
        {
          "truename": "张三",
          "userid": 2
        },
        {
          "truename": "王二",
          "userid": 3
        }
      ],
      "extra": null
    }

      

  • 相关阅读:
    音标,口型,舌位对照表:适合已有一定英语基础的人重新回顾音标发音,在不断的练习中让自己的发音更准确,口型更标准。
    c++友元函数和友元类
    经典MFC界面和Ribbon界面框架对比(单文档为例)
    QEM三维模型简化算法
    VC6和VS2008中C++编译器差异
    VS操作技巧
    msvcrt.lib和LIBCD.lib链接冲突
    二叉树遍历算法
    IE/QQ使用代理上网
    Google Map街景(红蓝立体)
  • 原文地址:https://www.cnblogs.com/BeenTogether/p/14566444.html
Copyright © 2011-2022 走看看