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
}

  

原文地址:https://www.cnblogs.com/BeenTogether/p/14566444.html