V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
PopRain
V2EX  ›  程序员

想问 javaer 一个问题,动态表格列后台怎么写?

  •  
  •   PopRain · 2022-03-30 15:29:05 +08:00 · 1755 次点击
    这是一个创建于 730 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有时候前端需要显示的数据表(Grid)列比较多,客户希望能根据自己的选择动态显示需要的数据列,前端只显示选定的列,另外,这个数据表显示的列可能来自多个不同的数据库表 join,查询条件也可能是不同的数据表的字段组合。

    平时用.net(core) , 实现很简单,根据用户选择要显示的列,在后台查询服务层根据规则生成 SQL(并参数化查询) ,然后调用数据访问层查询生成 DataTable(或者 DataSet),然后: 1.如果是 web api 需要,就可以用 DataTable 生成 json 返回前端显示 2.如果是 web form 就可以直接绑定 gridcontraol 显示 3.如果是远程调用(wcf) ,就可以序列化 DataTable 给调用端

    (思路大概就是这个思路,用的是 CQRS 查询与命令分离模式,具体情况会比较复杂,但是大概过程就是这样的)

    这种用 java 后端一般应该怎么做? 对 java 了解比较初级,想听听大家的方案,谢谢!

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

    3 最简单,2 最清晰。按需选择。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2859 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 12:58 · PVG 20:58 · LAX 05:58 · JFK 08:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.