JRT判断数据是否存在优化

有一种业务情况类似下图,质控能做的项目是仪器关联的项目。这时候维护质控物时候开通项目时候要求加载仪器项目里面的项目(没有开通的子业务数据的部分)。对右边已经开通的部分要求加载仪器项目里面的项目(有开通业务子数据的部分)。开通的业务子数据又会随时间推移有成千上万的数据。

在这里插入图片描述

按老的ORM写法就要把几千个开通子数据查询出来判断项目有没有开通。像下面代码,性能随时间会下降,写法也不直观:
在这里插入图片描述

	/*** 查询能够开通的项目,老写法* @return*/public String QueryOpenTestCode() throws Exception{//查是否有开通项目boolean HasOpen=Helper.ValidParam(JRTContext.GetRequest(Request, "HasOpen"), false);int MaterialDR=Helper.ValidParam(JRTContext.GetRequest(Request, "MaterialDR"), 0);//得到质控物的数据BTQCMaterial matDto=EntityManager().DolerGet(BTQCMaterial.class,MaterialDR);BTMIMachineParameter machDto=EntityManager().DolerGet(BTMIMachineParameter.class,matDto.MachineDR);//查询仪器项目List<BTMIMachineTestCode> machTsList=EntityManager().FindByColVal(BTMIMachineTestCode.class,"MachineParameterDR",matDto.MachineDR);//质控浓度数据List<BTQCMaterialLevel> levList=EntityManager().FindByColVal(BTQCMaterialLevel.class,"MaterialDR",MaterialDR);//返回列表List<BTMIMachineTestCodeDto> retList=new ArrayList<>();if(machTsList!=null&&machTsList.size()>0){for(int i=0;i<machTsList.size();i++){//没激活的不要if(machTsList.get(i).Active==false){continue;}for(int j=1;j<=matDto.Levels;j++){HashParam hs=new HashParam();hs.Add("MaterialDR",matDto.RowID);hs.Add("TestCodeDR",machTsList.get(i).TestCodeDR);hs.Add("LevelNo",j);//写法性能低,如果质控换批次有几千个子批次数据,都要查询组装数据List<BTQCMaterialTestCode> matTS=EntityManager().FindAllSimple(BTQCMaterialTestCode.class,hs);boolean hasOpen=false;if(matTS==null||matTS.size()==0){hasOpen=false;}else{hasOpen=true;}//根据开通决定输出if(hasOpen==HasOpen){BTMIMachineTestCodeDto one=new BTMIMachineTestCodeDto();one.LevelNo=j;one.LevelNoName="";for(BTQCMaterialLevel lev:levList){if(lev.LevelNo==j){one.LevelNoName=lev.CName;}}//项目数据BTTestCode tsDto=EntityManager().DolerGet(BTTestCode.class,machTsList.get(i).TestCodeDR);one.TestCodeCode=tsDto.Code;one.TestCodeDR=tsDto.RowID;one.TestCodeSynonym=tsDto.Synonym;one.TestCodeName=tsDto.CName;retList.add(one);}}}}return Helper.Object2Json(retList);}

为了解决这种问题,ORM提供新api,直接用top 1查主键判断查询是否存在数据,减少SQL输出和查询压力。
在这里插入图片描述

用新api改进的写法
在这里插入图片描述

	/*** 查询能够开通的项目或者已经开通的项目,新写法* @return*/public String QueryOpenTestCode() throws Exception{//查是否有开通项目boolean HasOpen=Helper.ValidParam(JRTContext.GetRequest(Request, "HasOpen"), false);//质控物主键int MaterialDR=Helper.ValidParam(JRTContext.GetRequest(Request, "MaterialDR"), 0);//得到质控物的数据BTQCMaterial matDto=EntityManager().DolerGet(BTQCMaterial.class,MaterialDR);//仪器数据BTMIMachineParameter machDto=EntityManager().DolerGet(BTMIMachineParameter.class,matDto.MachineDR);//查询仪器项目List<BTMIMachineTestCode> machTsList=EntityManager().FindByColVal(BTMIMachineTestCode.class,"MachineParameterDR",matDto.MachineDR);//质控浓度数据List<BTQCMaterialLevel> levList=EntityManager().FindByColVal(BTQCMaterialLevel.class,"MaterialDR",MaterialDR);//返回列表List<BTMIMachineTestCodeDto> retList=new ArrayList<>();if(machTsList!=null&&machTsList.size()>0){for(int i=0;i<machTsList.size();i++){//没激活的不要if(machTsList.get(i).Active==false){continue;}for(int j=1;j<=matDto.Levels;j++){HashParam hs=new HashParam();hs.Add("MaterialDR",matDto.RowID);hs.Add("TestCodeDR",machTsList.get(i).TestCodeDR);hs.Add("LevelNo",j);//按条件检查是否有数据,直接用SQL,top 1 主键查询,更高效,碰到一行就返回一个注解,SQL性能更高,返回数据量小boolean hasOpen=EntityManager().CheckHasData(BTQCMaterialTestCode.class,hs,null,null);//根据开通决定输出if(hasOpen==HasOpen){BTMIMachineTestCodeDto one=new BTMIMachineTestCodeDto();one.LevelNo=j;one.LevelNoName="";for(BTQCMaterialLevel lev:levList){if(lev.LevelNo==j){one.LevelNoName=lev.CName;}}//项目数据BTTestCode tsDto=EntityManager().DolerGet(BTTestCode.class,machTsList.get(i).TestCodeDR);one.TestCodeCode=tsDto.Code;one.TestCodeDR=tsDto.RowID;one.TestCodeSynonym=tsDto.Synonym;one.TestCodeName=tsDto.CName;retList.add(one);}}}}return Helper.Object2Json(retList);}

对判断子表数据行数而又不需要具体数据的情况用下面的方法
在这里插入图片描述
对应复制数据的提供拷贝相同名称属性值方法,方便快速拷贝
在这里插入图片描述

干净利落,不再拖泥带水。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/803935.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python从0到100(十二):函数的定义及模块

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

SQL注入sqli_libs靶场第一题

第一题 联合查询 1&#xff09;思路&#xff1a; 有回显值 1.判断有无注入点 2.猜解列名数量 3.判断回显点 4.利用注入点进行信息收集 爆用户权限&#xff0c;爆库&#xff0c;爆版本号 爆表&#xff0c;爆列&#xff0c;爆账号密码 2&#xff09;解题过程&#xff1…

GitHub 仓库 (repository) Pulse - Contributors - Network

GitHub 仓库 [repository] Pulse - Contributors - Network 1. Pulse2. Contributors3. NetworkReferences 1. Pulse 显示该仓库最近的活动信息。该仓库中的软件是无人问津&#xff0c;还是在火热地开发之中&#xff0c;从这里可以一目了然。 2. Contributors 显示对该仓库进…

easyExcel - 动态复杂表头的编写

目录 前言一、情景介绍二、问题分析三、代码实现方式一&#xff1a;head 设置方式二&#xff1a;模板导出方式三&#xff1a;自定义工具类 前言 Java-easyExcel入门教程&#xff1a;https://blog.csdn.net/xhmico/article/details/134714025 之前有介绍过如何使用 easyExcel&…

Jmeter02-2:参数化组件其他方式

0、Jmeter组件&#xff1a;参数化概述 0.1 是什么&#xff1f; 参数化是动态的获取并设置数据 0.2 为什么&#xff1f; 比如执行批量操作时&#xff0c;批量插入或批量删除&#xff0c;之前数据都是手写的&#xff0c;每执行完都要修改一次&#xff0c;效率太低 而参数化就是…

Python代码识别minist手写数字【附pdf】

一、概述 对于人类而言&#xff0c;要识别图片中的数字是一件很容易的事情&#xff0c;但是&#xff0c;如何让机器学会理解图片上的数字&#xff0c;这似乎并不容易。那么&#xff0c;能否找出一个函数&#xff08;模型&#xff09;&#xff0c;通过输入相关的信息&#xff0…

网络基础三——IP协议补充和Mac帧协议

全球网络及网段划分的理解 ​ 根据国家组织地区人口综合评估进行IP地址范围的划分&#xff1b; ​ 假设前8位用来区分不同的国家&#xff0c;国际路由器负责全球数据传输&#xff0c;子网掩码为IP/8&#xff1b;次6位区分不同的省份&#xff0c;国内路由器负责全国数据的传输…

jvm调优案例分析-window通过jstack查找死锁的进程

我们经常会遇到java程序遇死锁的问题&#xff0c;也会经常遇到。 案例 以下是案例代码&#xff1a; package com.dzend.mall.order;public class JstackLockDemo {public static final int initData 666;public static User user new User();public int compute(){int a1;i…

Window安装PostgresSQL

PostgreSQL 安装参考&#xff1a;Windows下安装PostgreSQL_window 安装postgresql-CSDN博客 安装好后打开pgAdmin4 配置Navicat连接PostgresSQL 找到安装目录文件 pg_hba.conf 修改配置增加&#xff1a; 修改前&#xff1a; # TYPE DATABASE USER ADDRES…

登录压力测试

目录 一、准备测试数据 1.1数据库存储过程添加数据 1.2导出为csv作为测试数据&#xff08;账号、密码&#xff09; 二、使用fiddler抓包查看接口 2.1.抓到相关接口信息 2.2添加线程组和http请求 2.3将前面接口需要的参数去json格式化 ​2.4填写相关信息 ​ 2.5添加http…

vue canvas绘制信令图,动态显示标题、宽度、高度

需求: 1、 根据后端返回的数据&#xff0c;动态绘制出信令图 2、根据 dataStatus 返回值&#xff1a; 0 和 1&#xff0c; 判断 文字内容的颜色&#xff0c;0&#xff1a;#000&#xff0c;1&#xff1a;red 3.、根据 lineType 返回值&#xff1a; 0 和 1&#xff0c; 判断 箭…

20240309web前端_第三周作业_教务系统页面

作业&#xff1a;教务系统页面 成果展示&#xff1a; 完整代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1…

Verilog实现手表计时

实现手表的计时功能&#xff1a; 1.具有start启动信号、pause暂停信号&#xff0c;可以自定义其触发机制。 2.具有时间更改接口&#xff0c;可以更改时、分、秒。 3.输出时、分、秒。 Verilog设计 模块端口定义&#xff1a; module watch1(input wire clk …

STC89C52学习笔记(七)

STC89C52学习笔记&#xff08;七&#xff09; 综述&#xff1a;本文介绍了串口以及讲述了串口相关寄存器如何配置并给予相关代码。 一、修改代码注意事项 在修改代码时不要一次性加入一堆代码&#xff0c;不利于定位错误。可以先注释一些代码&#xff0c;待解决完毕问题后再…

Angular 使用DomSanitizer

跨站脚本Cross-site scripting 简称XSS&#xff0c;是代码注入的一种&#xff0c;是一种网站应用程序的安全漏洞攻击。它允许恶意用户将代码注入到网页上&#xff0c;其他用户在使用网页时就会收到影响&#xff0c;这类攻击通常包含了HTML和用户端脚本语言&#xff08;JS&…

ES6基础(JavaScript基础)

本文用于检验学习效果&#xff0c;忘记知识就去文末的链接复习 1. ECMAScript介绍 ECMAScript是一种由Ecma国际&#xff08;前身为欧洲计算机制造商协会&#xff0c;英文名称是European Computer Manufacturers Association&#xff09;通过ECMA-262标准化的脚本程序设计语言…

基于拉格朗日分布算法的电动汽车充放电调度MATLAB程序

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 程序简介 该模型主要做的是基于拉格朗日分布算法的电动汽车充放电调度模型。利用蒙特卡洛模拟法模拟出电动汽车负荷曲线&#xff0c;并求解出无序充电功率曲线和有序充电曲线&#xff0c;该模型在电动汽车个…

逆向案例十六——简单webpack逆向,财联社信息

网址链接&#xff1a;财联社A股24小时电报-上市公司动态-今日股市行情报道 数据包sign参数为加密&#xff0c;可以直接搜索找参数的位置&#xff0c;搜索不到的情况下&#xff0c;在断点跟栈&#xff1a; 确定js文件所在位置&#xff0c;并打上断点。 点击加载刷新页面。可以发…

REST API实战演练之JavaScript使用Rest API

咱们前面讲了一下如何创建REST API 假期别闲着&#xff1a;REST API实战演练之创建Rest API-CSDN博客 又讲了java客户端如何使用REST API 假期别闲着&#xff1a;REST API实战演练之客户端使用Rest API-CSDN博客 接下来咱们看看JavaScript怎么使用REST API。 一、新建一个…

Log4J2漏洞(CVE-2024-44228)原理_log4j2漏洞原理,网络安全面试项目

Apache log4j2-RCE 漏洞 一、漏洞简介 二、漏洞原理 三、靶场漏洞复现 四、总结 Apache log4j2-RCE 漏洞 一、漏洞简介 Apache Log4j2是一个基于Java的日志记录工具&#xff0c;当前被广泛应用于业务系统开发&#xff0c;开发 者可以利用该工具将程序的输入输出信息进行日…