`

BD到Objects的转换时使用Map的一个陷阱.

阅读更多

BD到Objects的转换时使用Map的一个陷阱.

数据从BD到Objects的转变:

    上一篇中, 描述了下问题的引起及其解决, 这篇中将结合Hibernate的query机制来看看问题发生的根源.

    先看hibernate执行query时的工作原理, 它将分三步走: 第一步以Mapping配置为出发点根据用户的调用生成sql,第二步把生成的sql发往数据库等待结果返回, 第三步从数据库返回的结果集里取出数据转用Class来封装.在上篇中, 我们通过执行hibernate生成的sql看到resultset没问题, 这样先断定问题出在了hibernate对返回结果的解析/封装上. 那么hibernate在解析/封装DB中返回的结果时又都有哪些策略呢? 这就涉及到ResultTransformer这个接口, hibernate是通过这个接口里方法把DB返回的结果集用具体的Model对象(或纯粹的java.lang.Object对象)来封装的. 再看hibernate的源码,我们发现这个接口在hibernate中有如下七种默认实现:

        AliasToBeanConstructorResultTransformer

AliasToBeanResultTransformer
AliasToEntitymapResultTransformer
DistinctRootEntityResultTransformer
PassThroughResultTransformer
RootEntityResultTransformer
ToListResultTransformer

   这 七种实现我们不一一做介绍, 这里只说下AliasToEntitymapResultTransformer这个实现,它也就是上一篇程序中用的transformer.顾名思义, 这个实现是将DB中返回的结果集转为Map, 这个map是以添加Projections时的别名为key以期望值为value的,我们得到这些map后(这些map又一下子放到一个list里),再 手动地将结果集转为其它实用的Java类(现在想来这些手动的转换其实是可以自动完成的, 我想在下一篇中记录这方面的试验心得).

     上面这个过程就是往Map里放值, 再在自己的程序中通过key来取值了, 问题也就出在这里.
         projList.add(Projections.sum("contractBw"),"contractBw");  -- (1)

    我们看到上面这句是对contractBw求和, 并把求和后的结果以contractBw这样别名保存了下来,放到结果map中, 而这句:
         
projList.add(Projections.groupProperty(groupItem),groupItem);  -- (2)
   是负责设定分组的,其中的groupItem是从外面外来的, 它有三种情况, 其中一个就是contractBw, 这样就麻烦了, 不管(1)句里别名先放还是(2)句里的别名先放,都会有一个被覆盖掉.map嘛, 它有自己的规则.

    于是后面取值时,不管是map.get("
contractBw ")还是map.get(groupItem), 所得的结果是一样的.

    
     至此问题分析完了, 那么这段经历对自己以后的写程序有什么启示呢?
        1,写类似上面这样的公共代码时,一定考虑到client传来参数的所有可能性.若刚开始写程序时留点意的话,也不至于有后面的debug过程.
         2,遇到问题时, 多看源码,并在源码上设置断点, 有些问题在网上是查不到的, 或者说不好查到的, 只有看源码时的解决才能真正集中火力围攻问题.
         3,英语学习不能丢, 这次问题中, 若不是自己保持了较好的英语语感,也不可能在短时间内捕捉到问题的根源. 毕竟有太多的开源框架是以英语为母语的牛人写的, 看里面类和方法时, 有了较好的英语语感,理解上会顺利的多,像这里map,transformer这样很常用的单词就给了我很大的帮助.
         4,基础知识的重要性,这次问题的解决,若不是自己的Java基础知识还算扎实的话, 解决也不可能那么顺利.

分享到:
评论
1 楼 alan6288 2008-10-27  
楼主写启示的方式很奇怪,并不是写自己所欠缺的东西以便提高。

所以看了你的帖子,对我的启示就是:
方块字是重要的,要不是我上过小学,认得几个字,到现在我也不可能看懂你在说什么。。

相关推荐

    BD09 坐标 WGS84 坐标 GCJ02 坐标的相互转换

    这个转换通常被称为"偏移",涉及到一个双曲正弦函数,将WGS84坐标转换为保密的GCJ02坐标。转换公式涉及到经纬度的微小偏移,以防止精确的位置信息被直接获取。 **GCJ02到BD09的转换**: 百度坐标系统是在GCJ02的...

    android 百度地图 定位示例

    /**添加一个对象*/ RelativeLayout rlly_map = (RelativeLayout)findViewById(R.id.rlly_map); rlly_map.addView(mMapView); // 开启定位图层 mBaiduMap.setMyLocationEnabled(true); //初始化...

    收集的java坐标转换WGS84、GCJ02B、BD09及纠偏

    在IT行业中,尤其是在地理信息系统(GIS)和定位服务领域,坐标转换是一个重要的概念。这里提到的"java坐标转换"指的是使用Java编程语言处理不同坐标系之间的转换。在提供的压缩包中,有两个关键文件:`...

    一个提供了百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换的工具模块。

    在IT行业中,地理信息系统(GIS)是一个重要的领域,其中坐标转换是不可或缺的一部分。这个工具模块专注于处理中国特有的坐标系统,包括百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)以及国际通用的WGS84坐标系...

    百度地图API地址批量转换坐标(支持Excel上传).zip

    具体来说,使用“百度地图地址批量转换”工具,用户可以将包含地址信息的Excel表格上传,工具会通过调用百度地图API的地理编码服务,将Excel中的每个地址解析为对应的经纬度坐标。这一过程通常包括以下步骤: 1. ...

    使用Qt编写的将WGS84、高德GCJ-02、百度BD-09不同坐标系间的转换Demo

    在Qt/C++中实现这类转换时,通常会定义一个包含输入输出坐标的方法,如`double GeoTranslate::wgs84ToGcj02(double lon, double lat)`,并相应地提供反向转换的方法。为了支持QML中的直接调用,你需要将这个类注册为...

    56.(leaflet篇)leaflet百度坐标转天地图坐标(bd09转大地2000).zip

    本知识点主要聚焦于如何在使用Leaflet时将百度坐标(BD-09)转换为天地图坐标(大地2000,即CGCS2000)。下面我们将深入探讨这一主题。 首先,让我们了解这两种坐标系的基本概念。百度坐标(BD-09)是百度地图使用...

    week2utc.rar_GPS周内秒_GPS周和周内秒_gps周 周内秒_gps时间转换_site:www.pudn.com

    "周内秒"是在GPS周内的绝对时间,是一个无符号32位整数,从每个周日的00:00:00(GPST)开始计数,一直到下一个周日的00:00:00。这意味着周内秒的最大值是604800,之后会重置为0,进入新的GPS周。 将GPS周和周内秒...

    全能视频转换工具 Leawo Prof. Media 8.2.2.0 中文.zip

    Media 8 是一个包容各方的程序,它提供了多种解决方案,为数字娱乐。这个总的视频转换器可以作为高清视频转换器,DVD刻录机,蓝光的创造者,蓝光转换器,网络视频加速器和下载。 全能视频转换工具 Leawo Video ...

    DBDBMigration .bd文件 sqllite文件转换成其他数据库格式工具例:sql server 2008

    或者,我们可能需要将数据导入到MySQL,一个流行的开源数据库,或Microsoft Access,一个易于使用的数据库解决方案,特别适合小型企业和个人用户。 DBDBMigration工具正是解决这类问题的利器。它提供了简单直观的...

    WGS84、GCJ02、BD09坐标系shp数据的互转工具合集

    在地理信息系统(GIS)领域,坐标系的理解与...总之,这个工具集合对于那些需要在不同坐标系间处理shp数据的GIS工作者来说,是一个高效且实用的解决方案,能够帮助他们跨越坐标系的障碍,轻松实现数据的共享和应用。

    SHP文件坐标转换工具.7z

    目前,网上也有一些其它的坐标转换工具,但它们很可能会改变shp数据转换前后结构的一致性。而这款工具就没有这种问题,甚至你都不要安装GIS软件,就可以在本地快速进行shp数据的坐标转换! 一、功能描述 1.支持WGS84...

    用友nap开发nc65中的模版转换-业务单元左侧树构造

    1. **XML配置文件**: 在构建左侧树的过程中,首先需要定义一个XML配置文件,该文件用于描述树的结构以及每个节点的信息。这些信息包括但不限于节点的ID、名称、图标、链接等属性。 - 示例配置文件可能包含以下结构...

    使用说明 BD2-...-BB, BD2-DSB, BD2-BD[手册].pdf

    2. 文档类型:这是一个使用说明书,根据描述,手册包含了安装、拆卸和操作指南。 3. 多语言标识:文档内容包括了多种语言的表达方式,表明这是一个多语言版本的说明书,适用于不同语言的用户。具体包括了德语(DE)...

    swift-BD-09GCJ-02WGS84之间的互相转换

    例如,`BLMapCoordinatesChangeHelper-master`这个项目可能包含了一个名为`BLMapCoordinatesChangeHelper`的Swift类,该类提供了将BD-09、GCJ-02与WGS84之间互相转换的功能。 在实际应用中,可能会有以下几种转换...

    gps.py.zip_GPS 坐标转换_WGS84 GCJ02_bd09 wgs84_地球坐标转换_百度坐标

    如果你需要在中国使用GPS数据,你需要将接收到的WGS84坐标转换为GCJ02,然后再根据所使用的地图服务(如百度地图)转换为BD09坐标。反之,如果你想将国内的坐标数据分享给海外用户,需要将GCJ02或BD09转换回WGS84。 ...

    js经纬度转换WGS84 GCJ02 BD09

    下载下来,放到src/utils路径下面 需要用到的组件里面 import gcoord from ‘@/utils/gcoord.js’ const result = gcoord.transform( this.currentLocation, // 经纬度坐标 gcoord.GCJ02, // 当前坐标系 gcoord....

    使用说明 BD2.-...-.[手册].pdf

    根据提供的文件信息,我们可以推断出这是一份关于电气设备安装的手册——“使用说明 BD2”。这份手册包含了多语言的安全警告以及安装指导,适用于不同的国际标准。下面将详细解析这些信息中的关键知识点。 ### 标题...

    GYJ-0010_汽车0BD接口转换模块产品使用手册.pdf

    汽车GYJ-0010_汽车0BD接口转换模块资料及相关协议,支持ISO9141-2、ISO14230(KWP)、ISO15765(CANBUS)等协议的物理层,可通过OBD-16标准接口与现有绝大部分汽车的ECU进行诊

    排队取号,map组件使用小程序源码.zip

    在微信小程序开发中,"排队取号,map组件使用小程序源码.zip" 是一个非常实用的应用场景,它涉及到地图服务的集成以及用户交互的设计。在这个项目中,开发者使用了微信小程序的地图组件(Map Component)来实现用户...

Global site tag (gtag.js) - Google Analytics