最近公司接手了一个低代码二次开发平台的需求,需要连接多张表的数据然后展示到界面上。
按照java的sql思路,我们直接通过left join去关联表就行了,但是该低代码平台有对sql连表查询有限制,就是有些表它是存在一个domainKey的,实体表的domainKey如果不相同的话连表是不允许的。所以就无法使用连表了。
那么我的做法就是直接查询一张表,然后把需要连表的那些id都查询来,
也就是select xxx,xxx,xxx_id,yyy_id,ddd_id from xxx_table.
然后执行完sql之后的返回结果res进行解析。
一开始我是直接想在for循环里面,每一次遍历就调用一次sql通过id去查表。但是这样不行。不能在for循环,每次遍历去调用sql,这样会占用sql连接,造成资源占据大的情况。
所以最终的想法,就是单独查询xxx_id对应表名的数据,查询xxx_id对应表名的数据,查询ddd_id对应表名的数据。
然后再将每个sql对应的数据进行map映射成下面这中结构:
Map<key,value> => Map<id,object>
现在我写出一个例子:
然后我们就可以在遍历的时候,直接调用该方法就行了。
如下:
testDBResult.stream().foreach((arg) -> {
arg.setXXXName(map.get(arg.getXXXId()) == null ? "" : map.get(arg.getXXXId()).getXXXName());
arg.setYYYName(map.get(arg.getYYYId()) == null ? "" : map.get(arg.getYYYId())).getYYYName();
arg.setDDDName(map.get(arg.getDDDId()) == null ? "" : map.get(arg.getDDDId())).getDDDName();
})
总结:
巧用java8的stream流的.collect(Collectors.toMap(arg1,arg2))适用于通过返回结果的id查对应表的某一个数据。当然可以直接连表是最好的。
最后:
如果大家觉得这篇文章对你们有所帮助的话,麻烦点个免费的赞赞,也祝各位码农在未来的IT的道路上越走越远,谢谢。