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

对于需要判断条件的查询,是在 service 中判断还是直接用动态 SQL?

  •  
  •   zhao1014 · 2022-07-26 12:04:36 +08:00 · 2019 次点击
    这是一个创建于 859 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如说有一个表示文章实体类 article ,它有一个文章标题字段 title 。

    我需要实现:

    if(title != null){
    	添加条件“where article.title like #{dto.title}”
    }
    

    这个判断是在 service 层做好还是直接在 XML 里面用 <where> 标签? 如果用 <where> 标签算不算把业务流程写到 SQL 里去了?

    6 条回复    2022-07-28 10:16:37 +08:00
    thinkershare
        1
    thinkershare  
       2022-07-26 12:10:41 +08:00   ❤️ 1
    按照标题检索过滤本质上并不是什么逻辑操作, 也不属于业务流程, 简单来说, 它就是个数据检索, 正常情况应该由 Repository 这种基础设施提供好封装, 对业务层次完全透明. 另外 XML 是什么鬼? Java 的 XML 配置生成 SQL?
    另外什么叫将业务写入 SQL? 查询当然最终是需要写入 SQL 的, 不管你怎么做. 将业务写入 SQL 一般说的是再 SQL 层面做一致性逻辑校验, 属于修改范畴.
    zhao1014
        2
    zhao1014  
    OP
       2022-07-26 12:27:20 +08:00
    @thinkershare 因为 mybatis 本身就不是完全封装好的 orm ,需要自己动手写 SQL ,我说的 <where> 是 mybatis 提供的动态 SQL 功能之一,基本上等于拼接 SQL 字符串,区别是 <where> 可以根据条件判断是拼接还是不拼接。
    不过我理解你的意思了,谢谢!
    LeegoYih
        3
    LeegoYih  
       2022-07-26 15:53:40 +08:00   ❤️ 1
    按我的理解,你只能在 xml 里判断 title 是否为 null 。因为 title 为 null 时,直接用 `where article.title like #{dto.title}` 肯定是有问题的。
    mybatis 就是用于动态 SQL 的场景,而且,这个判断跟业务流程也没太大关系,只是说 title 字段是 ignorable 的,在注释中写清楚就行。
    dcsuibian
        4
    dcsuibian  
       2022-07-26 16:04:12 +08:00
    Spring Data JPA Specification
    yuanshuai1995
        5
    yuanshuai1995  
       2022-07-26 16:47:34 +08:00
    这题 XML 里面用 <where> 标签 没啥问题
    melodysoyan2
        6
    melodysoyan2  
       2022-07-28 10:16:37 +08:00
    mybatisplus
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2607 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 06:44 · PVG 14:44 · LAX 22:44 · JFK 01:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.