在之前的文章提到过关于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动态传参在springData中的应用(补充)相关推荐

  1. sql 不为空_sql动态传参在springData中的应用(补充)

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

  2. 中给函数赋读权限_教你如何使用MCGS昆仑通态设置密码增加权限

    大家好!我们在工业生产过程控制中,为了尽量避免由于现场人为的误操作所引发的故障或事故,而某些误操作所带来的后果有可能是致命性的.为了防止这类事故的发生,所以需要严格限制各类操作的权限,使不具备操作资格 ...

  3. linux给目录赋访问权限_【Linux】Linux系统中的权限详解

    我们linux服务器上有严格的权限等级,如果权限过高导致误操作会增加服务器的风险.所以对于了解linux系统中的各种权限及要给用户,服务等分配合理的权限十分重要. 一.文件基本权限 首先看下linux ...

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

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

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

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

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

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

  7. C语言将字符串s连接到t的后面,下列给定程序中,函数fun的功能是:先将字符串s中的字符按正序存放到字符串t..._考试资料网...

    问答题下列给定程序中,函数fun的功能是:先将字符串s中的字符按正序存放到字符串t中,然后把s中的字符按逆序连接到字符串t的后面. 例如,当s中的字符串为"ABCDE"时,则t中的 ...

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

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

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

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

最新文章

  1. PHP中的MYSQL常用函数(php下操作数据库必备)
  2. python学习笔记之编写readConfig读写配置文件
  3. python super 参数问题
  4. java 中以||作为split分隔符正确的写法
  5. matlab pretty什么用,matlab如何使输出结果更美观(symdisp函数——pretty函数升级版)...
  6. mysql workbench中文设置 mac系统,win系统,linux系统
  7. 词法分析程序实验报告
  8. 转载:浅谈程序员的数学修养
  9. 对计算机硬件的工作原理的认识,计算机硬件组成及工作原理
  10. 在linux下运行锐捷客户端,锐捷Linux客户端使用方法(基于ubuntu16.04)
  11. Cadence学习之路(八)画PCB前你必须知道的事情!
  12. 论文排版LaTeX学习笔记
  13. Let's encrypt 通配域名(二级, 三级)
  14. 安卓ssr无网络连接_安卓手机不能上网无法链接网络的原因及解决方法
  15. 后端开发实习生面经(已收offer)中科院计算所下属某所
  16. 以下关于python缩进的描述_以下关于Python缩进的描述中,错误的是
  17. 开源大阅兵:盘点那些走向世界的中国项目
  18. N1盒子安装 aria2(带AriaNg前端)
  19. Word的样式库在 选项卡中_word排版应用:如何创建文本样式和表格样式
  20. 对分解和组合思维方法的理解

热门文章

  1. 吴恩达 Drive.ai 因经营困难“卖身”苹果
  2. Amazon亲儿子MXNet与其他框架有哪些不同?| 赠书
  3. 前端开发者如何利用 CSS 实现酷炫的变色方案?
  4. 高德地图联手中国气象局,积水地图 AI 版实时预测道路积水
  5. 第 9 章 适配器设计模式
  6. 操作系统swap对redis的性能的影响以及解决方案
  7. problem making ssl connection
  8. PHP三级联动视频教程,PHP教程:thinkPHP实现的省市区三级联动功能示例
  9. linux下的svn搭建,Ubuntu 14.04 下搭建SVN服务器 svn://
  10. 把一个人的特点写具体作文_五年级下册语文习作把一个人的特点写具体教学视频+教案课件+范文...