在 Java 业内, 难道多表联合查询都是复杂问题吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
skyworker
V2EX    Java

在 Java 业内, 难道多表联合查询都是复杂问题吗?

  •  1
     
  •   skyworker 2022-05-15 15:08:31 +08:00 2974 次点击
    这是一个创建于 1259 天前的主题,其中的信息可能已经有所发展或是发生改变。

    正在用 sprint-boot 做项目, 需要一个简单的多表联合查询然后输出 json, 如果用原来的 laravel 解决(顺便还解决了分页):

    https://imgur.com/a/PR1Mpu

    而在 java 业内, 貌似要搞好多"方案"/"方法"才能解决. javaer 真有那么苦吗?

    Senorsen
        1
    Senorsen  
       2022-05-15 16:08:53 +08:00
    (虽然不是 javaer )不知道你说的具体苦在哪里。

    如果用 Hibernate ORM + Spring JPA 的话,图中这种需求应该是不需要写 SQL / HQL 的,Repository 里一句接口函数声明就好了。

    如果 Entity 对应字段没标 eager fetch ,可能需要写点 HQL 标记字段为 join fetch 。

    如果对应方法需要分页,用 Pageable 接口就可以了。
    skyworker
        2
    skyworker  
    OP
       2022-05-15 16:51:16 +08:00
    @Senorsen java 中实现肯定可以实现, 只不过又需要一堆的 interface/service/mapper/xml/sql 而已, 感觉有点拖了内裤放屁的意思. 谁让 java/Spring 是如此"严谨"的工程哪
    rykinia
        3
    rykinia  
       2022-05-15 17:59:24 +08:00   2
    @skyworker 别人回的都是真在解决问题,就是加注解和参数,然后注解要怎么配置,哪有你说的那么复杂。我看你倒没想解决问题,只是想阴阳怪气,为了这碟醋专门包的饺子吧。
    24bit
        4
    24bit  
       2022-05-15 19:23:19 +08:00
    我觉得 java 业内最宝贵的财富之一就是这么多年积累下来的这些方案和方法。
    Senorsen
        5
    Senorsen  
       2022-05-15 20:54:54 +08:00
    @skyworker 不至于,我 1L 说的,基本只需写个:

    https://gist.github.com/Senorsen/edd0fb0306fbc022be5f636eeb9c9736

    调用处直接使用 employee. findByCompanyId(companyId, PageRequest(分页参数即 offset limit 等)) 就好了,没有那么多你说那些
    knives
        6
    knives  
       2022-05-15 21:17:09 +08:00
    还可以试试 EntityGraph 这个注解
    anyele
        7
    anyele  
       2022-05-15 21:34:27 +08:00
    确实没很好的方案, 大多都是写 XML 的 SQL, 很难受, 或者是 Spring Jpa + QueryDSL 但可以试试 Bean Searcher , https://github.com/ejlchina/bean-searcher/blob/master/README.zh-CN.md
    thetbw
        8
    thetbw  
       2022-05-16 09:23:28 +08:00
    @skyworker 这些一般都是自动生成就好,只是为了保持相同的结构,新人直接过来也能很短的时间内熟悉代码(只是属熟悉业务需要点时间)。接口我们这小厂实际使用场景不多,其他的设计还是有用的。
    还有 java 最爽的一点就是重构的时候,可以看到所有引用,然后方便去检查改动是否合理,有没有漏改或者忽略什么。
    zmal
        9
    zmal  
       2022-05-16 10:29:48 +08:00
    是啊,用 java 的都是笨比,op 最聪明了呢。
    认真回答下:java 主流规范目前不建议多表联查,有数据规模上升后的查询效率问题,分库分表后的重构困难等。复杂的 sql 往往会耦合业务,造成一些排查难、debug 难,是非常不推荐的开发方式。ORM 框架也没往这方向发力。
    如果真想联查,用 @select 写个 sql ,mybatis 也不是非要写 xml 的。
    nothingistrue
        10
    nothingistrue  
       2022-05-16 10:42:22 +08:00
    @skyworker #2 见你楼上的回复,当你使用 Spring Data JPA 以后,多表联合查询没那么复杂,只需要接口中定义一个方法,方法名旁边用注解再定义一个 SQL (用原生 SQL 而不用 HQL/JPL 都没问题)。(前提是实体类和接口已经定义过了,这个相对于 PHP 这些可能还是麻烦一些,但这是一次定义终审省事,并且这已经涉及强类型语言跟弱类型语言的对比了。)

    @rykinia #3 现在用 Spring Data JPA 的并不多,如果是用 Mybatis ,即使是 Mybatis Plus, 那楼主说得是没错的。
    night98
        11
    night98  
       2022-05-16 11:38:18 +08:00
    google 一下不麻烦,即使是 mybatis 也已经有成熟的强类型编程的多表关联解决方案,至于你图上这种字符串满天飞的方案,个人觉得不咋地
    RedBeanIce
        12
    RedBeanIce  
       2022-05-16 11:56:01 +08:00
    超过 3 张稍大的表,性能就会变慢,所以楼主该不会没有写过复杂业务吧。不会吧不会吧不会吧。

    (或许是 javaer 与 xxx 魔怔了,可别是个谁都来 java 这里问问题了,求求了。)
    要问问题就好好问,别天天阴阳怪气
    skyworker
        13
    skyworker  
    OP
       2022-05-16 19:46:54 +08:00
    @RedBeanIce 业务偏向于企业内部 ERP 系统, 特点是 字段多(一个表中可能有 50 个字段), 并且每个表中的数据行数 5 年累计出来, 不会超过 5K 行, 不是"百万并发"的行业
    skyworker
        14
    skyworker  
    OP
       2022-05-16 19:48:10 +08:00
    @RedBeanIce 我们手头的系统, 甚至不用特地加索引也行, 所以多表关联很常见, 甚至关联 4-5 张表也有
    skyworker
        15
    skyworker  
    OP
       2022-05-16 21:40:15 +08:00
    @nothingistrue 的确是 Mybatis
    RedBeanIce
        16
    RedBeanIce  
       2022-05-17 09:58:26 +08:00
    @skyworker 建议可以试试好好设计表,多写单表。

    这种设计,这种代码,,,维护起来非常痛苦。
    unregister
        17
    unregister  
       2022-05-19 11:30:04 +08:00 via Android
    @skyworker 你就不是来理性讨论的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     973 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 18:44 PVG 02:44 LAX 11:44 JFK 14:44
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86