有时候前端需要显示的数据表(Grid)列比较多,客户希望能根据自己的选择动态显示需要的数据列,前端只显示选定的列,另外,这个数据表显示的列可能来自多个不同的数据库表 join,查询条件也可能是不同的数据表的字段组合。
平时用.net(core) , 实现很简单,根据用户选择要显示的列,在后台查询服务层根据规则生成 SQL(并参数化查询) ,然后调用数据访问层查询生成 DataTable(或者 DataSet),然后: 1.如果是 web api 需要,就可以用 DataTable 生成 json 返回前端显示 2.如果是 web form 就可以直接绑定 gridcontraol 显示 3.如果是远程调用(wcf) ,就可以序列化 DataTable 给调用端
(思路大概就是这个思路,用的是 CQRS 查询与命令分离模式,具体情况会比较复杂,但是大概过程就是这样的)
这种用 java 后端一般应该怎么做? 对 java 了解比较初级,想听听大家的方案,谢谢!
1
ccppgo 2022-03-30 15:33:20 +08:00
全部查询全部返回, 显示什么由前端控制
|
2
xwayway 2022-03-30 15:38:15 +08:00
1. 后端控制,接口传入需要显示的列,后端查询之前过滤,或者查出来了再过滤。比较推荐查出来后,进行过滤,不需要的字段返 null 就行,或者是在强迫症,copy 一个 json 返回去。
2. 前端控制,返回所有列,前端显示需要的列就行。 |
3
PopRain OP @ccppgo 数据表会关联很多,不同人希望看到得数据列不一样(需要关联得数据表多少也不一样,根据选择得列,有时 1 个表就可以了,有时可能要关联 3-4 个表,全部字段加起来有几百个了,而且偶尔还要返回几千条记录,不做筛选后端查询效率太低,返回数据太多前端处理也不太合理(数据筛选也是有权限的,全部返回稍微懂点的能看到不该看得数据)。
|
4
wolfie 2022-03-30 15:54:44 +08:00
包含 Set<Field> 的 DTO ,根据规则拆成多个 A_TABLE_DTO 、B_TABLE_DTO ...
提供 shouldJoin() 判断,动态拼 SQL ,这个用 mybatis 比较好写点。 |
5
zhangleshiye 2022-03-30 15:57:22 +08:00
为啥我感觉这个算 bi 报表的需求?
|
6
potatowish 2022-03-30 15:59:37 +08:00
把多个库的表数据刷到 es ,根据条件在 body 中通过 includes 指定需要返回的字段即可
|
7
PopRain OP @zhangleshiye 传统企业,ERP 系统这种需求应该比较多,每个岗位都关注数据的一部分,但是不同企业岗位设置又不一样,没有办法按岗位设计不同的界面,就只能这种“半定制”界面显示。
|
8
freeup 2022-03-30 17:26:48 +08:00
这个需求我刚好做个一个服务能实现这种查询,只是最开始做这个服务的目的不是为了查询。
我做了一个元数据服务,也就是把数据表进行结构化,配置字段关系,字段类型等等,然后通过给定的查询条件自动生成 sql ,并且支持穿透查询,达到动态查询的目的。一个列表的结构也就是一个元数据,每个元数据的字段是后台配置的,只是根据需求返回指定的列或指定的条件数据而已 |
9
xianzhe 2022-03-30 21:18:10 +08:00 via Android
简单做法比较赞同二楼的,终极解决方案上 GraphQ
|
10
zmal 2022-03-31 10:01:09 +08:00
1. 数据层的 sql 枚举出所有 join 情况,根据前端回传的字段列表选择 sql 。
2. 把 join 从 sql 提到代码层,其他和 1 相同。这样更容易控制。 3. 数据层返回全部字段,代码中筛选。查询慢的问题可以做缓存和预查询。但查询过于复杂可能会影响数据库整体性能,编码层面无法解决。 3 最简单,2 最清晰。按需选择。 |