sql 不为空_sql动态传参在springData中的应用(补充)
在之前的文章提到过关于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中的应用(补充)相关推荐
- 中给函数赋读权限_sql动态传参在springData中的应用(补充)
在之前的文章提到过关于sql动态传参在springData中的应用,下面补充一下关于原生sql和springData的同一需求下的两种不同的写法: 需求:contoller层传递一个map给servi ...
- jeecg-boot中popup实现动态传参
jeecg-boot中popup实现动态传参 环境: 功能实现: 后话: 环境: 最近任务是基于jeecg-boot框架的,用的是jeecg-boot V2.4.0版. 功能实现: 有表"p ...
- 函数动态传参详细,作用域和名称空间,global和nonlocal
1. 动态传参(重点) *, ** *, ** : 形参: 聚合 位置参数* -> 元组 关键字** -> 字典 实参: 打散 列表, 字符串, 元素 -> * 字典 -> * ...
- 在Java中动态传参调用Python脚本
最近,又接触到一个奇葩的接口,基于老板不断催促赶时间的情况下,在重写java接口和复用已有的python脚本的两条路中选择了后者,但是其实后者并没有好很多,因为我是一个对python的认识仅限于其名称 ...
- vue 中的动态传参和query传参
Vue router 如何传参 params.query 是什么? params:/router1/:id,这里的 id 叫做 params.例如/router1/123, /router1/789 ...
- python调用shell脚本的参数_使用python执行shell脚本 并动态传参 及subprocess的使用详解
最近工作需求中 有遇到这个情况 在web端获取配置文件内容 及 往shell 脚本中动态传入参数 执行shell脚本这个有多种方法 最后还是选择了subprocess这个python标准库 subpr ...
- v-for 循环 @click 动态传参(参数动态)
v-for 循环 @click 动态传参(参数动态) 代码示下: @click="function('id_'+data.id)" 以上就是关于"v-for 循环 @cl ...
- 动态传参, 名称空间, 嵌套, gloabal, nonlocal
一, 动态传参 1. *args 接收到的是元组 先用位置参数进行传参, 剩下的位置参数用*args进行传参 2. **kwargs 接收到的是一个字典 先用关键字参数进行传参, 剩下的参数用**kw ...
- Vue路由动态渲染和动态传参
一.动态渲染路由 // router/routerjs{ path: '/movie/1', component: Movie}, //app组件<router-link to="/m ...
最新文章
- 你必须会的 JDK 动态代理和 CGLIB 动态代理
- RGB_YUV_YCbCr
- php禁止国外访问,wordpress 禁止国外ip访问
- ADO.NET数据库操作------SqlDataReader和SqlDataAdapter 区别
- 牛顿儿时成绩很差,5岁开始接触物理,也许是他如此伟大的唯一原因!
- HTML中用弹性布局设置位置,HTML的flex弹性布局
- 文章采集伪原创工具_伪原创文章技巧(如何提高伪原创文章的原创度)
- 黑盒测试方法之等价类划分
- 电影《寒战2》中的管理知识
- ROS笔记——创建简单的主题发布节点和主题订阅节点
- adb shell get/setprop, setenforce...
- python-字符串格式化(万古枯)
- Striped64 api详解
- BZOJ4167 : 永远的竹笋采摘
- 怎么才能制作一个比较好的网站
- vscode背景图片无法删除
- 七夕有哪些送女朋友的小众又高级的礼物?小众又高级的礼物推荐
- 如何成为一名合格的DBA
- 移动硬盘-移动硬盘提示格式化的解决办法
- linux的nslookup命令,Linux nslookup命令
热门文章
- ASP.NET MVC的JavaScriptResult
- VSS 数据库地址批量更改器 - VSS Database Changer
- 如何查看PublicKeyToken
- java struts2下载zip_Struts2多文件下载
- od send断点 下_Win7 od下send断点
- mysql 64位整型_高性能MySQL笔记精简(整数和实数优化)
- python串口通信_python 读取串口数据的示例
- oracle启动bat命令,ORACLE 启动 bat 脚本
- python wget 卡住_python – Paramiko在执行大型wget命令时挂起
- fgetcsv php,PHP - fgetcsv - 分隔符被忽略?