JRT实体视图查询

news2024/9/23 19:25:50

JRT的设计目标就是多数据库支持,对于爬行周边数据提供DolerGet解决爬取多维数据问题。但是对于通过父表字段筛选子表数据就不能通过DolerGet取数据了,因为查询到的父表数据没有子表数据的ID。

比如下面表:

我需要按登记号查询这个登记号的报告数据,如果先查询父表数据,再循环一个个查子数据,那么数据多了之后需要交互数据库太多了,就会慢,这种情况就需要级联查询,来减少交互次数。而父表数据也拿不到子表的ID,因而不能利用DolerGet特性。
在这里插入图片描述

在这里插入图片描述

所以需要ORM来支持视图查询,常规的一般是提供SQL语句执行的api直接执行SQL。但是这样跨数据库就不能无缝支持了,为此需要提供一种独立于数据库的视图查询方法。

首先定义实体来描述级联关系
在这里插入图片描述
然后定义一个基类来存储视图描述数据
在这里插入图片描述
然后抽取一个所有视图实体要实现的接口供ORM得到视图描述信息
在这里插入图片描述
定义一个注解来标记视图
在这里插入图片描述

定义视图
在这里插入图片描述
ORM根据视图注解调用获取视图信息接口得到信息后组装视图SQL

/**
     * 构造视图的SQL语句
     * @param factory
     * @param tableInfo
     * @param model
     * @throws Exception
     */
    private static void MakeViewTableInfo(IDbFactory factory,TableInfo tableInfo,Object model) throws Exception
    {
        if(model==null)
        {
            model=tableInfo.ModelClass.getConstructor().newInstance();
        }
        BaseViewInterface base=(BaseViewInterface)model;
        BaseView view=base.GetView();
        StringBuilder tmpSb=new StringBuilder();
        tmpSb.append("(select ");
        String fromSql=" from ";
        boolean hasAddCol=false;
        //得到视图列信息
        Field[] viewFields = tableInfo.ModelClass.getDeclaredFields();
        HashMap<String,Field> viewFiledMap=new HashMap<>();
        for(Field f:viewFields)
        {
            viewFiledMap.put(f.getName(),f);
        }
        //记录已经添加的列,避免重复添加
        HashMap<String,Boolean> hasAddColMap=new HashMap();
        for(int i=0;i<view.TableList.size();i++)
        {
            ViewModelDto one=view.TableList.get(i);
            if(one.LinkType==null||one.LinkType.isEmpty())
            {
                one.LinkType="left";
            }
            String oneModelName=one.ModelClass.getSimpleName();
            if(i==0) {
                fromSql += " " + factory.DealTableName(GetTableName(one.ModelClass)) + " "+oneModelName+" ";
            }
            else
            {
                fromSql += one.LinkType+" join " + factory.DealTableName(GetTableName(one.ModelClass)) + " " + oneModelName+" on "+oneModelName+"."+one.LinkCurCol+"="+one.PerModelClass.getSimpleName()+"."+one.LinkPerCol+" ";
            }
            //得到列信息
            Field[] declaredFields = one.ModelClass.getDeclaredFields();
            //指定了查询列
            HashMap<String,Boolean> colMap=new HashMap<>();
            if(one.Cols!=null&&!one.Cols.isEmpty())
            {
                String [] colArr=one.Cols.split(",");
                for(String col:colArr)
                {
                    if(col.isEmpty())
                    {
                        continue;
                    }
                    colMap.put(col,true);
                }
            }
            //得到查询列
            for (int j = 0; j < declaredFields.length; j++) {
                if(colMap.size()>0&&!colMap.containsKey(declaredFields[j].getName()))
                {
                    continue;
                }
                String colName=declaredFields[j].getName();
                if(!viewFiledMap.containsKey(colName))
                {
                    continue;
                }
                Field colFile=viewFiledMap.get(colName);
                String transName="";
                if(one.ColTrans!=null&&one.ColTrans.containsKey(colName))
                {
                    transName=" as "+factory.DealPropertyName(one.ColTrans.get(colName));
                }
                //避免重复列名
                if(hasAddColMap.containsKey(colName))
                {
                    continue;
                }
                JRT.DAL.ORM.Common.ColumnInfo col = new JRT.DAL.ORM.Common.ColumnInfo();
                FrekeyAttribute fk = colFile.getAnnotation(FrekeyAttribute.class);
                col.FkInfo = fk;
                col.Name = colName;
                col.ColType = colFile.getType();
                col.FieldInfo = colFile;
                tableInfo.ColList.add(col);
                //特殊列
                Annotation dateAttribute = colFile.getAnnotation(DateAttribute.class);
                //日期0,时间1,布尔2
                if (dateAttribute != null) {
                    tableInfo.SpCol.put(col.Name, 0);
                }
                Annotation timeAttribute = colFile.getAnnotation(TimeAttribute.class);
                if (timeAttribute != null) {
                    tableInfo.SpCol.put(col.Name, 1);
                }
                Annotation boolAttribute = colFile.getAnnotation(BoolAttribute.class);
                if (boolAttribute != null) {
                    tableInfo.SpCol.put(col.Name, 2);
                }
                //根据IdAttribute注解得到表ID字段
                IdAttribute id = colFile.getAnnotation(IdAttribute.class);
                if (id != null) {
                    JRT.DAL.ORM.Common.IdInfo idInfo = new JRT.DAL.ORM.Common.IdInfo();
                    idInfo.Key = col.Name;
                    idInfo.Value = col.Value;
                    tableInfo.ID = idInfo;
                }
                if(hasAddCol==false) {
                    tmpSb.append(oneModelName + "." + factory.DealPropertyName(col.Name));
                }
                else
                {
                    tmpSb.append("," + oneModelName + "." + factory.DealPropertyName(col.Name));
                }
                hasAddColMap.put(col.Name,true);
                hasAddCol=true;
            }
        }
        tmpSb.append(" "+fromSql+")");
        tableInfo.VewSql=tmpSb.toString();
    }

视图实体和正常单表实体一样查询数据
在这里插入图片描述
测试效果
在这里插入图片描述

这样基于DolerGet和视图查询开发业务就可以游刃有余了

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

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

相关文章

tree组件实现折叠与展开功能(方式2 - visible计算属性)

本示例节选自vue3最新开源组件实战教程大纲&#xff08;持续更新中&#xff09;的tree组件开发部分。考察Vue3 Composition API形式的计算属性的用法&#xff0c;computed可以单独用在ts文件中&#xff0c;实现ts的计算属性类型的定义。 父节点属性 在IFlatTreeNode中定义父节…

Blackbox AI:你的智能编程伙伴

目录 Blackbox AI 产品介绍 Blackbox AI 产品使用教程 Blackbox AI体验 AI问答 代码验证 实时搜索 探索&代理 拓展集成 总结 Blackbox AI 产品介绍 Blackbox是专门为程序员量身定制的语言大模型&#xff0c;它针对20多种编程语言进行了特别训练和深度优化&#xff0c;在AI代…

MySQL JDBC

JDBC&#xff1a;Java的数据库编程 JDBC&#xff0c;即Java Database Connectivity&#xff0c;java数据库连接。是一种用于执行SQL语句的Java API&#xff0c;它是 Java中的数据库连接规范。这个API由 java.sql.*,javax.sql.* 包中的一些类和接口组成&#xff0c;它为Java 开…

MySQL:基础操作(增删查改)

目录 一、库的操作 创建数据库 查看数据库 显示创建语句 修改数据库 删除数据库 备份和恢复 二、表的操作 创建表 查看表结构 修改表 删除表 三、表的增删查改 新增数据 插入否则更新 插入查询的结果 查找数据 为查询结果指定别名 结果去重 where 条件 结…

tree组件实现折叠与展开功能(方式1 - expandedTree计算属性)

本示例节选自vue3最新开源组件实战教程大纲&#xff08;持续更新中&#xff09;的tree组件开发部分。考察响应式对象列表封装和computed计算属性的使用&#xff0c;以及数组reduce方法实现结构化树拍平处理的核心逻辑。 实现思路 第一种方式&#xff1a;每次折叠或展开后触发…

经纬恒润全新第二代行泊一体域控制器成功量产

随着L2自动驾驶功能的普及&#xff0c;整车架构的升级&#xff0c;传统分布式控制器已不能适应市场的发展&#xff0c;如何以低成本高性能实现高阶自动驾驶功能的落地, 成为了众多整车厂的迫切需求&#xff0c;行泊一体域控制器应运而生。据高工数据显示&#xff0c;2023年仅1-…

NVIDIA GPU 监控观测最佳实践

1、DCGM 介绍 DCGM&#xff08;Data Center GPU Manager&#xff09;即数据中心 GPU 管理器&#xff0c;是一套用于在集群环境中管理和监视 Tesla™GPU 的工具。它包括主动健康监控&#xff0c;全面诊断&#xff0c;系统警报以及包括电源和时钟管理在内的治理策略。它可以由系…

TypeScript 基础类型(一)

简介 它是 JavaScript 的超集&#xff0c;具有静态类型检查和面向对象编程的特性。TypeScript 的出现&#xff0c;为开发者提供了一种更加严谨和高效的开发方式。 主要特点&#xff1a; 、静态类型检查。 通过静态类型检查&#xff0c;开发者可以在编译时发现错误&#xff0…

大气热力学(8)——热力学图的应用之一(气象要素求解)

本篇文章源自我在 2021 年暑假自学大气物理相关知识时手写的笔记&#xff0c;现转化为电子版本以作存档。相较于手写笔记&#xff0c;电子版的部分内容有补充和修改。笔记内容大部分为公式的推导过程。 文章目录 8.1 复习斜 T-lnP 图上的几种线8.1.1 等温线和等压线8.1.2 干绝热…

搬运5款我觉得超级好用的软件

​ 今天再来推荐5个超级好用的效率软件&#xff0c;无论是对你的学习还是办公都能有所帮助&#xff0c;每个都堪称神器中的神器&#xff0c;用完后觉得不好用你找我。 1.PDF阅读——Sumatra PDF ​ Sumatra PDF 是一款 PDF 阅读器&#xff0c;它的界面简洁&#xff0c;使用起…

乐尚代驾一项目概述

前言 2024年7月17日&#xff0c;最近终于在低效率的情况下把java及其生态的知识点背的差不多了&#xff0c;投了两个礼拜的简历&#xff0c;就一个面试&#xff0c;总结了几点原因。 市场环境不好 要知道&#xff0c;前两年找工作&#xff0c;都不需要投简历&#xff0c;把简历…

DevExpress WPF中文教程 - 为项目添加GridControl并将其绑定到数据

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

小程序-3(页面导航+页面事件+生命周期+WXS)

目录 1.页面导航 声明式导航 导航到tabBar页面 导航到非tabBar页面 后退导航 编程式导航 后退导航 导航传参 声明式导航传参 编程式导航传参 在onload中接收导航参数 2.页面事件 下拉刷新 停止下拉刷新的效果 ​编辑 上拉触底 配置上拉触底距离 上拉触底的节…

函数返回右值的一点学习研究

https://zhuanlan.zhihu.com/p/511371573?utm_mediumsocial&utm_oi939219201949429760 下面情况下不会调用&#xff1a; DPoint3d fun1() {return DPoint3d{1,2,3}; // 默认构造 }int main() {DPoint3d&& a fun1();a.y 20;int i 0;i; } 下面情况下&#xff0c…

【内网穿透】如何本地搭建Whisper语音识别模型并配置公网地址

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

数据库管理的艺术(MySQL):DDL、DML、DQL、DCL及TPL的实战应用(下:数据操作与查询)

文章目录 DML数据操作语言1、新增记录2、删除记录3、修改记录 DQL数据查询语言1、查询记录2、条件筛选3、排序4、函数5、分组条件6、嵌套7、模糊查询8、limit分页查询 集合操作union关键字和运算符in关键字any关键字some关键字all关键字 联合查询1、广义笛卡尔积2、等值连接3、…

【.NET全栈】ASP.NET开发Web应用——站点导航技术

文章目录 前言一、站点地图1、定义站点地图文件2、使用SiteMapPath控件3、SiteMap类4、URL地址映射 二、TreeView控件1、使用TreeView控件2、以编程的方式添加节点3、使用TreeView控件导航4、绑定到XML文件5、按需加载节点6、带复选框的TreeView控件 三、Menu控件1、使用Menu控…

【BUG】已解决:ModuleNotFoundError: No module named ‘cv2’

已解决&#xff1a;ModuleNotFoundError: No module named ‘cv2’ 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开…

C语言中常见库函数(1)——字符函数和字符串函数

文章目录 前言1.字符分类函数2.字符转换函数3.strlen的使用和模拟实现4.strcpy的使用和模拟实现5.strcat的使用和模拟实现6.strncmp的使用和模拟实现7.strncpy函数的使用8.strncat函数的使用9.strncmp函数的使用10.strstr的使用和模拟实现11.strtok函数的使用12.strerror函数的…

打破运维“冷门槛“|暴雨液冷数据中心方案再升级

如果将数据比喻为驱动世界运转的新引擎&#xff0c;那数据中心便是为引擎提供源源不断动力的泵站。但随着泵站功率的日益增强&#xff0c;热浪成了不可避免的副产品。如何将数据热能转化为科技动能&#xff0c;是人工智能可持续发展的重要前提。 液冷技术&#xff0c;不仅可实现…