MyBatis 接收数据库中没有的字段的解决

 更新时间:2022年03月10日 11:06:40   作者:辰小狼睡不醒  
这篇文章主要介绍了MyBatis 接收数据库中没有的字段的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

接收数据库中没有的字段

问题描述

浏览器页面想要通过E-hcart表格,展示一些数据。这些数据需要从数据库中计算而来。但是在数据库中没有的字段。比如说要查询某些记录。如车辆的在线数量,离线数量和无数据的数量。这些数据是通过MySql的聚合函数得到的。

sql语句如下:

SELECT
    sum(
        updatetime > date_sub(now(), INTERVAL 0.5 DAY)
    ) AS online,
    sum(updatetime IS NULL) nodata,
    count(1) - sum(
        updatetime > date_sub(now(), INTERVAL 0.5 DAY)
    ) - sum(updatetime IS NULL) AS offline
,COUNT(1)
FROM
    cx_onecdata
WHERE
    kdgs = '顺丰'
AND cartype LIKE '%gps%'

查询的结果如上图。

注意,这些统计的字段都是数据库中没有的。

那么问题来了,该如何获取这些数据呢?

问题的解决方法

在MyBaits中生成相对应的字段。比如,我的实体类中是这样的(也就是DO):

public class Sfcar {
    private Integer online;
    private Integer nodata;
    private Integer offline;
    public Integer getOnline() {
        return online;
    }
    public void setOnline(Integer online) {
        this.online = online;
    }
    public Integer getNodata() {
        return nodata;
    }
    public void setNodata(Integer nodata) {
        this.nodata = nodata;
    }
    public Integer getOffline() {
        return offline;
    }
    public void setOffline(Integer offline) {
        this.offline = offline;
    }

MyBatis中对应的映射文件是这样配置的:

    <!--  GPS 车辆统计  -->
  <select id="findbySFCarGPS" resultMap="BaseResultMap">
    SELECT
        sum(
            updatetime &gt; date_sub(now(), INTERVAL 0.5 DAY)
        ) AS online,
            sum(updatetime IS NULL) nodata,
            count(1) - sum(
                updatetime &gt; date_sub(now(), INTERVAL 0.5 DAY)
            ) - sum(updatetime IS NULL) AS offline
        FROM
            cx_onecdata
        WHERE
            kdgs = '顺丰'
        AND cartype LIKE '%gps%'
  </select>

这里有两个注意的点。一是:返回结果类型是resultMap=”BaseResultMap”。二,MyBatis是跟实体类映射,而不是跟数据库对应的表映射,所以可以直接写想要的Sql。最好用这个Do 来接收想要的数据。

至此,可以完美解决字段不对应的问题。

最后页面显示的效果:

数据通过渲染得到想要的效果。

说明一下:以前数据中获取不对应的字段时,我是用List集合里面放Map集合,获取所要的数据。

用来解码的代码如:

        List<String> legend = new ArrayList<String>();
        List<Map> serisData=new ArrayList<Map>();
        List<TreeMap<String,Integer>> data = car_Service.selectCarTypeCount();
        int count = 0;
        List<String> car_typename= new ArrayList<String>();
        List<String> car_typevalue = new ArrayList<String>();
        //      Map<String,String> mapdata= new HashMap<>();
        //  遍历以Key - Value 形式遍历
        for (Map<String, Integer> map : data){ 
            Map tarMap =new HashMap();
            for (Map.Entry<String, Integer> k : map.entrySet()){ 
                count++;
                if (count % 2 == 0) {
                    car_typename.add(k.getValue()+"");
                }else{
                    car_typevalue.add(k.getValue()+"");
                }
            } 
            for (int i = 0; i < car_typename.size(); i++) {
                // 获取 List 中的 String 数组元素。
                String cartype_name = car_typename.get(i);
                String cartype_value = car_typevalue.get(i);
                //              mapdata.put(cartype_name, cartype_value);
                if (i== car_typename.size()-1) {
                    legend.add(cartype_name);
                    tarMap.put("value", cartype_value);
                    tarMap.put("name", cartype_name);
                    serisData.add(tarMap);
                }
            }
        }
        // 纵坐标
        List<SeriesVO> series = new ArrayList<>();
        series.add(new SeriesVO("总数比较", "pie",serisData));
        EchartDataVO targetdata = new EchartDataVO(legend,null, series);
        // 获取 目标数据 JSON 格式
        return targetdata;

至此问题解决!

数据库中找不到相应的字段应该怎么做

数据库中找不到相应的字段

有的字段是以符号、数字的形式存在,所以直接找不到。

1.首先找到映射表,在隐射表中包含我们想要的字段。

2.去相应的表中查找映射表中的字段。

注意1:我们想要的字段可能在映射表中有两个或更多的字段组合而成,所以去需要的表中分别找到这些不同的字段组合。

注意2:两个或更多的字段可能分别在不同的表中,此时需要联表。

注意3:–山东xxx和七xxxx河酒店hotelinfo.Product_typ=6,但是hotelinfo.Product_typ=‘11’ AND hotelinfo.Territory_cd='Z’才组合成换成其他系统,

但是因为Product_typ=6了,不能=11,

所以Product_typ=6 AND cust_LEVEL="Z"是换成其他系统,

可以在PMS系统中查到,换成其他系统的表头叫做“酒店级别”

所以并不是一对一组合,而是多对多的组合

并不是Para_typ=9AND para_CD=5营销部,Para_typ=10/11.。。AND para_CD="5"也营销部

注意4:Para_typ=9/10/11/…在另一个表中可能是属于不同的字段

举例如下:

完成上级给的任务时先让他看一遍,避免返工浪费时间

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • idea中Stash与Unstash的使用及说明

    idea中Stash与Unstash的使用及说明

    这篇文章主要介绍了idea中Stash与Unstash的使用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Java基础之浅谈hashCode()和equals()

    Java基础之浅谈hashCode()和equals()

    今天给大家带来的是关于Java基础的相关知识,文章围绕着hashCode()和equals()展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • SpringBoot集成MinIO的示例代码

    SpringBoot集成MinIO的示例代码

    对象存储服务OSS是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件,这篇文章主要介绍了SpringBoot集成MinIO的示例代码,需要的朋友可以参考下
    2023-06-06
  • Springboot使用Junit测试没有插入数据的原因

    Springboot使用Junit测试没有插入数据的原因

    这篇文章主要介绍了Springboot使用Junit测试没有插入数据的原因,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Java定时调用.ktr文件的示例代码(解决方案)

    Java定时调用.ktr文件的示例代码(解决方案)

    这篇文章主要介绍了Java定时调用.ktr文件的示例代码,本文给大家分享遇到问题及解决方法,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • java使用tess4j进行图片文字识别功能

    java使用tess4j进行图片文字识别功能

    Tess4J 是Java (JNA) 对 Tesseract OCR API 的封装,Tess4J是java直接可使用的jar包,而Tesseract OCR是支持Tess4J进文件文字识别的基础,Tess4J可直接使用Maven方式引入,这篇文章主要介绍了java使用tess4j进行图片文字识别,需要的朋友可以参考下
    2023-04-04
  • Spring Boot在Web应用中基于JdbcRealm安全验证过程

    Spring Boot在Web应用中基于JdbcRealm安全验证过程

    这篇文章主要为大家介绍了Spring Boot在Web应用中基于JdbcRealm安全验证过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪<BR>
    2023-02-02
  • dubbo 如何使用logback来输出日志

    dubbo 如何使用logback来输出日志

    这篇文章主要介绍了dubbo 如何使用logback来输出日志的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 详解基于java的Socket聊天程序——客户端(附demo)

    详解基于java的Socket聊天程序——客户端(附demo)

    这篇文章主要介绍了详解基于java的Socket聊天程序——客户端(附demo),客户端设计主要分成两个部分,分别是socket通讯模块设计和UI相关设计。有兴趣的可以了解一下。
    2016-12-12
  • SpringBoot配置Redis实现保存获取和删除数据

    SpringBoot配置Redis实现保存获取和删除数据

    本文主要介绍了SpringBoot配置Redis实现保存获取和删除数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,感兴趣的小伙伴们可以参考一下
    2021-06-06

最新评论