请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于sysDeptService里的方法

问题1:update方法里面 为什么要用checkExists验证两次? 第一次我理解为判断传入参数是否合规。 第二次为什么还要判断?

问题2:checkExists 的countByNameAndParentId 的sql 为什么要id!=#{id} ,什么叫更新的时候排除这个部门?验证更新的时候id这个条件验证是否必须?没太明白。

正在回答 回答被采纳积分+3

2回答

Jimin 2018-07-30 23:40:36

//img1.sycdn.imooc.com//szimg/5b5f30010001d4ef09520416.jpg

以我当前的数据为例,目前UI(id为4)部门下面有两个子部门,UI和UE(parent_id为4)

这时如果想在UI上下面新增一个部门,部门名称在做校验时就需要对比是否和已有的两个部门名称重复,不能做任何行的排除;

而如果是修改UI(id为13)这个部门呢(可能是修改这个部门的某一个属性,可能是部门名称,也可能是seq或其他),这时在做校验时就要排除id = 13这一行,就是排除待更新行后去检查。这时如果UI这个部门名称本身没修改,不会查到重复的部门名称;修改为UE会查到重复的部门名称;修改为非UE的其他名称都不会查到重复的部门名称。

0 回复 有任何疑惑可以回复我~
Jimin 2018-07-29 11:02:11

你好,那个checkExist的操作确实多写了一次,可以去掉一个的,之前更新了一次代码,已经删除了。

重点说一下这个方法的实现,对应的业务逻辑是同一个层级下不该有两个相同名称的部门,这属于比较正常的业务要求。

这个方法本身是同时为新增部门和更新部门两个方法提供的,新增的时候很明显是没有部门id的,只需要在同一个层级下看是否有同样的名称就可以了。

而更新部门时,之前数据库里对应有一个这个部门名称的,如果你不修改部门名称,修改了其他内容去更新,这里很明显同一个层级下会有相同的名称,就是当前这个部门自己。因此这里是通过加上id的判断,保证做校验时自己是什么都不在检查的数据里,本质上是拿这个部门的数据和层级下其他部门信息做检查是否有冲突。

0 回复 有任何疑惑可以回复我~
  • 提问者 慕UI33545 #1
    是不是这个意思?
    当我更新parentid 或者 name的时候 这个sql语句在判断条件那里就不成立了 返回0值。
    当我不更新parentid和name的时候 此时where条件那里必然会查到此条数据 进而返回1,而为了确保更新成功 引入了id值得判断 这样在更新其他属性的时候 sql返回的依然是0
    回复 有任何疑惑可以回复我~ 2018-07-29 22:19:02
  • Jimin 回复 提问者 慕UI33545 #2
    这不是关键点,感觉你还是没懂我那里要表达的意思,本质上是在相同的parentid下,不能有相同的部门名称。而这个相同不能是自己和自己相同的,因此更新时要排除掉当前待更新的部门id,新增时传入的id为空,这时就是在parentid下找之前是否原来的部门中有和要新增的部门名称相同。不知这回你明白没有
    回复 有任何疑惑可以回复我~ 2018-07-30 09:11:39
  • 提问者 慕UI33545 回复 Jimin #3
    您的意思是 abcd四个部门,要更新a的时候 通过sql判断 parentid 和 name都相同 同时排除自身id 则查询结果为0 可以更新;如果不排除自身id则查询结果不为0 不能更新。
    
    假设:A和B从属于Root A和B两个大部门下都有子部门叫“技术部”。这个新增的时候是可以通过验证的 而且表中数据这两条id也是不同的。 那么B的技术部在更新的时候 sql查询是可以查到A的技术部的啊。
    
    老师您举个例子吧。谢谢
    回复 有任何疑惑可以回复我~ 2018-07-30 11:24:23
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信