JRT实体视图查询

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和视图查询开发业务就可以游刃有余了

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
2020年是“jrt0166”的发展之年。在这一年,jrt0166迎来了许多重要的事件和转折点。 首先,jrt0166在2020年取得了巨大的发展和成就。他们成功推出了多个创新产品,并在市场上获得了广泛认可和赞誉。jrt0166团队经过不懈努力,不断改进和创新,使其产品在质量和性能方面不断提高,赢得了许多忠实的用户。 其次,2020年也是jrt0166公司扩大市场份额的一年。他们积极参加各种国内外展览和行业会议,与客户和合作伙伴广泛交流,拓展了合作关系。通过不断增强市场竞争力,他们成功进入了新的市场领域,为公司的长远发展打下了坚实基础。 此外,2020年也是jrt0166注重企业文化建设和员工培养的一年。他们积极组织各种培训和活动,提升员工的技能和动力。公司注重员工的职业发展和个人成长,并提供了广阔发展空间,使员工感受到公司的关心和支持。 最后,2020年也带来了一些挑战和困难。例如,全球爆发的COVID-19疫情对全球经济造成了巨大冲击,jrt0166也不例外。然而,面对挑战,jrt0166团队坚定信心,灵活应对,并采取了一系列应对措施,保持了公司的正常运营,并取得了不俗的业绩。 综上所述,2020年对于jrt0166来说是一个充满挑战和机遇的年份。通过不懈努力,创新实践和灵活应对,jrt0166成功地应对了各种挑战,并取得了长足发展,为公司的未来发展奠定了坚实基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小乌鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值