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 }