在之前的文章提到过关于sql动态传参在springData中的应用,下面补充一下关于原生sql和springData的同一需求下的两种不同的写法:

需求:contoller层传递一个map给service层,需要从map中取到三个参数(pid、enVisible、type)给数据库进行查询返回结果集。

需求明细:

1.不确定前端是否会传递这三个参数,换言之,这三个参数不一定能够取到;

2.如果传递传递参数pid、enVisible,如果能取到值的话,则按照相应的条件进行筛选;

3.type参数传递,如果传递参数为空则,则筛选出符合其他条件的全部数据;如果传递为0,则筛选出type为1和2的数据;如果传递参数不为0(为1或2或3),则筛选出与之对应的数据。

处理逻辑放在service层实现方法1——springData通过Specification进行实现:

dao层写法:

public interface PermissionDao extends JpaRepository, JpaSpecificationExecutor {}

service写法:

 public List findAll(Map map){  //1.需要查询条件 Specification specification = new Specification() { @Override public Predicate toPredicate(Root root, CriteriaQuery> criteriaQuery, CriteriaBuilder criteriaBuilder) { //查询条件list接受 List list = new ArrayList(); //pid:父id应用 if (!StringUtils.isEmpty(map.get("pid"))){ list.add(criteriaBuilder.equal(root.get("pid").as(String.class),(String)map.get("pid"))); } //enVisible:0:查询平台所有权限(最高权限);1:查询组织的权限 if(!StringUtils.isEmpty(map.get("enVisible"))){ list.add(criteriaBuilder.equal(root.get("enVisible").as(String.class),(String)map.get("enVisible"))); } // type:查询全部权限列表type:0: 菜单+按钮(权限点) 1:菜单 2;按钮(权限点) 3:api接口 if (StringUtils.isEmpty(map.get("type"))){ String type = (String)map.get("type"); CriteriaBuilder.In in = criteriaBuilder.in(root.get("type")); if("0".equals(type)){ in.value(1).value(2); }else { in.value(Integer.parseInt(type)); } } return criteriaBuilder.and(list.toArray(new Predicate[list.size()])); } }; return permissionDao.findAll(specification); }

处理逻辑放在dao层实现方法2——springData通过原生sql进行实现:

dao层写法:

public interface PermissionDao extends JpaRepository, JpaSpecificationExecutor { @Query(value = "select * from pe_permission where (pid = ?1 or ?1 is null) and (en_visible = ?2 or ?2 is null) and IF(?3 is null,(1 = 1),IF(?3 = 0,type in (1,2), type = ?3))",nativeQuery = true) List selectList(Object pid, Object enVisible, Object type);}

service写法:

 public List findAll(Map map){  return permissionDao.selectList(map.get("pid"),map.get("enVisible"),map.get("type")); }

两种方式经测试都可以实现需求,但从代码量上来说,第二种实现方式肯定是优于第一种方式的;但从程序的可读性来说,如果sql比较好的同学,那么第二种方式可能跟适合一些,但是如果是springData学的比较好的同学可能更喜欢第一种吧。

第一种方式基本就是借用springData封装好的接口去实现逻辑的,再此我不赘述了,关于第二种方式,我多啰嗦几句:(pid = ?1 or ?1 is null)和(en_visible = ?2 or ?2 is null)在上一篇文章也说过,基本的意思就是判断传递过来的参数是否为空,如果不为空就按照传递过来的参数进行检索,如果为空的话就相当与没条件一个意思。

至于IF函数是mysql数据库种自带的函数,IF(表达式1,表达式2,表达式3):表达式1返回布尔值,如果返回为true,那么去执行表达式2;如果返回为false,那么执行表达式3。但个人不推荐这种写法,原因是必须是mysql数据或者该数据库中必须含有这个函数;所以换个数据库的话,就必须要换个函数,其他数据库不是很了解,如果是Oracle数据库的话,得将这个函数换成Nvl2()这个函数,用法是一样的,也可以实现同样的效果,不过这样也暴露出这种方式的一个问题,如果写原生sql中含有某种数据库特定的数据库函数,那么它的移植性就会差一点。

关于springData中动态传参的见解就这些了,希望大家喜欢,不说了,我去写bug了哈。

sql 不为空_sql动态传参在springData中的应用(补充)相关推荐

  1. 中给函数赋读权限_sql动态传参在springData中的应用(补充)

    在之前的文章提到过关于sql动态传参在springData中的应用,下面补充一下关于原生sql和springData的同一需求下的两种不同的写法: 需求:contoller层传递一个map给servi ...

  2. jeecg-boot中popup实现动态传参

    jeecg-boot中popup实现动态传参 环境: 功能实现: 后话: 环境: 最近任务是基于jeecg-boot框架的,用的是jeecg-boot V2.4.0版. 功能实现: 有表"p ...

  3. 函数动态传参详细,作用域和名称空间,global和nonlocal

    1. 动态传参(重点) *, ** *, ** : 形参: 聚合 位置参数* -> 元组 关键字** -> 字典 实参: 打散 列表, 字符串, 元素 -> * 字典 -> * ...

  4. 在Java中动态传参调用Python脚本

    最近,又接触到一个奇葩的接口,基于老板不断催促赶时间的情况下,在重写java接口和复用已有的python脚本的两条路中选择了后者,但是其实后者并没有好很多,因为我是一个对python的认识仅限于其名称 ...

  5. vue 中的动态传参和query传参

    Vue router 如何传参 params.query 是什么? params:/router1/:id,这里的 id 叫做 params.例如/router1/123, /router1/789 ...

  6. python调用shell脚本的参数_使用python执行shell脚本 并动态传参 及subprocess的使用详解

    最近工作需求中 有遇到这个情况 在web端获取配置文件内容 及 往shell 脚本中动态传入参数 执行shell脚本这个有多种方法 最后还是选择了subprocess这个python标准库 subpr ...

  7. v-for 循环 @click 动态传参(参数动态)

    v-for 循环 @click 动态传参(参数动态) 代码示下: @click="function('id_'+data.id)" 以上就是关于"v-for 循环 @cl ...

  8. 动态传参, 名称空间, 嵌套, gloabal, nonlocal

    一, 动态传参 1. *args 接收到的是元组 先用位置参数进行传参, 剩下的位置参数用*args进行传参 2. **kwargs 接收到的是一个字典 先用关键字参数进行传参, 剩下的参数用**kw ...

  9. Vue路由动态渲染和动态传参

    一.动态渲染路由 // router/routerjs{ path: '/movie/1', component: Movie}, //app组件<router-link to="/m ...

最新文章

  1. 你必须会的 JDK 动态代理和 CGLIB 动态代理
  2. RGB_YUV_YCbCr
  3. php禁止国外访问,wordpress 禁止国外ip访问
  4. ADO.NET数据库操作------SqlDataReader和SqlDataAdapter 区别
  5. 牛顿儿时成绩很差,5岁开始接触物理,也许是他如此伟大的唯一原因!
  6. HTML中用弹性布局设置位置,HTML的flex弹性布局
  7. 文章采集伪原创工具_伪原创文章技巧(如何提高伪原创文章的原创度)
  8. 黑盒测试方法之等价类划分
  9. 电影《寒战2》中的管理知识
  10. ROS笔记——创建简单的主题发布节点和主题订阅节点
  11. adb shell get/setprop, setenforce...
  12. python-字符串格式化(万古枯)
  13. Striped64 api详解
  14. BZOJ4167 : 永远的竹笋采摘
  15. 怎么才能制作一个比较好的网站
  16. vscode背景图片无法删除
  17. 七夕有哪些送女朋友的小众又高级的礼物?小众又高级的礼物推荐
  18. 如何成为一名合格的DBA
  19. 移动硬盘-移动硬盘提示格式化的解决办法
  20. linux的nslookup命令,Linux nslookup命令

热门文章

  1. ASP.NET MVC的JavaScriptResult
  2. VSS 数据库地址批量更改器 - VSS Database Changer
  3. 如何查看PublicKeyToken
  4. java struts2下载zip_Struts2多文件下载
  5. od send断点 下_Win7 od下send断点
  6. mysql 64位整型_高性能MySQL笔记精简(整数和实数优化)
  7. python串口通信_python 读取串口数据的示例
  8. oracle启动bat命令,ORACLE 启动 bat 脚本
  9. python wget 卡住_python – Paramiko在执行大型wget命令时挂起
  10. fgetcsv php,PHP - fgetcsv - 分隔符被忽略?