JRT判断数据是否存在优化

news2024/11/23 2:57:36

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

在这里插入图片描述

按老的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.coloradmin.cn/o/1581657.html

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

相关文章

概率论基础——拉格朗日乘数法

概率论基础——拉格朗日乘数法 概率论是机器学习和优化领域的重要基础之一&#xff0c;而拉格朗日乘数法与KKT条件是解决优化问题中约束条件的重要工具。本文将简单介绍拉格朗日乘数法的基本概念、应用以及如何用Python实现算法。 1. 基本概念 拉格朗日乘数法是一种用来求解…

Redis缓存穿透和缓存雪崩

一、缓存穿透 1 什么是缓存穿透 缓存穿透说简单点就是大量请求的 key 根本不存在于缓存中&#xff0c;导致请求直接到了数据库上&#xff0c;根本没有经过缓存这一层。举个例子&#xff1a;某个黑客故意制造我们缓存中不存在的 key 发起大量请求&#xff0c;导致大量请求落到数…

scFed:联邦学习用于scRNA-seq分类

scRNA-seq的出现彻底改变了我们对生物组织中细胞异质性和复杂性的理解。然而&#xff0c;大型&#xff0c;稀疏的scRNA-seq数据集的隐私法规对细胞分类提出了挑战。联邦学习提供了一种解决方案&#xff0c;允许高效和私有的数据使用。scFed是一个统一的联邦学习框架&#xff0c…

用户态网络缓冲区的设计

一、网络缓冲区 在内核中也是有网络缓冲区的&#xff0c;比如使用 read 读取数据&#xff08;read 是一种系统调用&#xff0c;第一个参数为 fd&#xff09;&#xff0c;当陷入到内核态的时候&#xff0c;会通过 fd 指定 socket&#xff0c;socket 会找到对应的接收缓冲区。在…

安装VMware ESXi虚拟机系统

简介&#xff1a;ESXi是VMware公司开发的一款服务器虚拟化操作系统。它能够在一台物理服务器上运行多个虚拟机&#xff0c;每个虚拟机都可以独立运行操作系统和应用程序&#xff0c;而且对硬件配置要求低&#xff0c;系统运行稳定。 准备工具&#xff1a; 1.8G或者8G以上容…

7-155 好玩的游戏:消消乐

消消乐是一个非常流行的手机游戏。现在游戏创意设计师Jerry突发奇想设计一个如下图所示的一维消消乐游戏,Jerry想知道游戏生成的小球布局在玩家玩的过程中最高总分能得多少,现在Jerry向资深的程序员你求助,希望你能帮助他算出每个游戏初局的最高得分。 游戏规则是这样的:…

SWM341系列应用(RTC、FreeRTOS\RTTHREAD应用和Chip ID)

SWM341系列RTC应用 22.1、RTC的时钟基准 --liuzc 2023-8-17 现象:客户休眠发现RTC走的不准&#xff0c;睡眠2小时才走了5分钟。 分析与解决&#xff1a;经过排查RTC的时钟源是XTAL_32K&#xff0c;由于睡眠时时设置XTAL->CR0&#xff1b;&#xff0c;会把XTAL_32K给关…

【DM8】外部表

外部表是指不存在于数据库中的表。 通过向达梦数据库定义描述外部表的元数据&#xff0c;可以把一个操作系统文件当成一个只读的数据库表&#xff0c;对外部表将像普通定义的表一样访问。 外部表的数据存储在操作系统文件中&#xff0c;建立外部表的时候&#xff0c;不会产生…

B02、分析GC日志-6.3

1、相关GC日志参数 -verbose:gc 输出gc日志信息&#xff0c;默认输出到标准输出-XX:PrintGC 输出GC日志。类似&#xff1a;-verbose:gc-XX:PrintGCDetails 在发生垃圾回收时打印内存回收详细的日志&#xff0c; 并在进程退出时输出当前内存各区域分配情况-XX:PrintGCTimeStamp…

深度学习-多尺度训练的介绍与应用

一、引言 在当今快速发展的人工智能领域&#xff0c;多尺度训练已经成为了一种至关重要的技术&#xff0c;特别是在处理具有复杂结构和不同尺度特征的数据时。这种技术在许多应用中发挥着关键作用&#xff0c;例如图像识别、自然语言处理和视频分析等。 多尺度训练的定义 多尺…

设计模式(22):解释器模式

解释器 是一种不常用的设计模式用于描述如何构成一个简单的语言解释器&#xff0c;主要用于使用面向对象语言开发的解释器和解释器设计当我们需要开发一种新的语言时&#xff0c;可以考虑使用解释器模式尽量不要使用解释器模式&#xff0c;后期维护会有很大麻烦。在项目中&…

4月9日学习记录

[GXYCTF 2019]禁止套娃 涉及知识点&#xff1a;git泄露&#xff0c;无参数RCE 打开环境&#xff0c;源码什么的都没有&#xff0c;扫描后台看看 扫描发现存在git泄露 用githack下载查看得到一串源码 <?php include "flag.php"; echo "flag在哪里呢&#…

django之ajax

【一】前言 Ajax 异步提交局部刷新 发送请求的方式 浏览器地址栏直接输入url回车 GET请求a标签href属性 GET请求form表单 GET请求/POST请求ajax GET请求/POST请求 ​ AJAX 不是新的编程语言&#xff0c; 而是一种使用先有标准的新方法&#xff08;比如装饰器&#xff09; …

AtCoder ABC347 A-D题解

个人感觉这次D有点难。 比赛链接:ABC347 Problem A: 签到题。 #include <bits/stdc.h> using namespace std; int main(){int N,K;cin>>N>>K;for(int i1;i<N;i){int A;cin>>A;if(A%K0)cout<<A/K;}return 0; } Problem B: 主要考substr的…

unity按路径移动

using System; using System.Collections; using System.Collections.Generic; using UnityEngine;public class FollowPathMove : MonoBehaviour {public Transform[] wayPointArray;[SerializeField] private Transform PathA;//路径点的父物体[SerializeField]private Trans…

紫光展锐T610平台_4G安卓核心板方案定制开发

紫光展锐T610核心板配备Android 11操作系统&#xff0c;采用12nm制程工艺。该处理器CPU由2颗基于Cortex-A75架构的大核心和6颗基于Cortex-A55架构的小核心组成&#xff0c;最高主频为1.8GHz。GPU采用的是614.4MHz的Mali G52&#xff0c;可以流畅播放2400*1080分辨率视频&#x…

MacOS初识SIP——解决快捷指令sh脚本报错Operation not permitted

前言 因为一些原因&#xff0c;设计了一套快捷指令&#xff0c;中间涉及到一个sh脚本的运行&#xff0c;通过快捷指令运行时就会报错&#xff1a;operation not permitted 奇怪的是在快捷指令窗口下运行一切正常&#xff0c;但是从其他地方直接调用&#xff0c;例如通过Comma…

典型新能源汽车热管理系统方案分析

目前行业具有代表性的热管理系统有PTC电加热方案、热泵方案&#xff08;特斯拉八通阀热泵、吉利直接式热泵&#xff09;、威马的柴油加热方案以及以理想为代表的插电式混动车方案。 小鹏P7整车热管理方案分析&#xff08;PTC电加热方案&#xff09; 小鹏P7作为小鹏汽车的第2款…

免费Docker容器服务Koyeb和Zeabur介绍及推荐

想搭建个演示站点仅是演示用。在哪找免费的云服务&#xff1f;还是有很多的。前面介绍过replit&#xff0c;这里介绍下几个提供免费云服务的的PaaS平台Koyeb和Zeabur&#xff0c;Zeabur平台或许是最好的选择。比如把个人的博客免费部署上去&#xff0c;也是个不错的选择呢。 前…

JVM字节码与类的加载——类的加载过程详解

文章目录 1、概述2、加载(Loading)阶段2.1、加载完成的操作2.2、二进制流的获取方式2.3、类模型与Class实例的位置2.4、数组类的加载 3、链接(Linking)阶段3.1、链接阶段之验证(Verification)3.1.1、格式检查3.1.2、字节码的语义检查3.1.3、字节码验证3.1.4、符号引用验证 3.2、…