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基础知识还算扎实的话, 解决也不可能那么顺利.
分享到:
相关推荐
这个转换通常被称为"偏移",涉及到一个双曲正弦函数,将WGS84坐标转换为保密的GCJ02坐标。转换公式涉及到经纬度的微小偏移,以防止精确的位置信息被直接获取。 **GCJ02到BD09的转换**: 百度坐标系统是在GCJ02的...
/**添加一个对象*/ RelativeLayout rlly_map = (RelativeLayout)findViewById(R.id.rlly_map); rlly_map.addView(mMapView); // 开启定位图层 mBaiduMap.setMyLocationEnabled(true); //初始化...
在IT行业中,尤其是在地理信息系统(GIS)和定位服务领域,坐标转换是一个重要的概念。这里提到的"java坐标转换"指的是使用Java编程语言处理不同坐标系之间的转换。在提供的压缩包中,有两个关键文件:`...
在IT行业中,地理信息系统(GIS)是一个重要的领域,其中坐标转换是不可或缺的一部分。这个工具模块专注于处理中国特有的坐标系统,包括百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)以及国际通用的WGS84坐标系...
具体来说,使用“百度地图地址批量转换”工具,用户可以将包含地址信息的Excel表格上传,工具会通过调用百度地图API的地理编码服务,将Excel中的每个地址解析为对应的经纬度坐标。这一过程通常包括以下步骤: 1. ...
在Qt/C++中实现这类转换时,通常会定义一个包含输入输出坐标的方法,如`double GeoTranslate::wgs84ToGcj02(double lon, double lat)`,并相应地提供反向转换的方法。为了支持QML中的直接调用,你需要将这个类注册为...
本知识点主要聚焦于如何在使用Leaflet时将百度坐标(BD-09)转换为天地图坐标(大地2000,即CGCS2000)。下面我们将深入探讨这一主题。 首先,让我们了解这两种坐标系的基本概念。百度坐标(BD-09)是百度地图使用...
"周内秒"是在GPS周内的绝对时间,是一个无符号32位整数,从每个周日的00:00:00(GPST)开始计数,一直到下一个周日的00:00:00。这意味着周内秒的最大值是604800,之后会重置为0,进入新的GPS周。 将GPS周和周内秒...
Media 8 是一个包容各方的程序,它提供了多种解决方案,为数字娱乐。这个总的视频转换器可以作为高清视频转换器,DVD刻录机,蓝光的创造者,蓝光转换器,网络视频加速器和下载。 全能视频转换工具 Leawo Video ...
或者,我们可能需要将数据导入到MySQL,一个流行的开源数据库,或Microsoft Access,一个易于使用的数据库解决方案,特别适合小型企业和个人用户。 DBDBMigration工具正是解决这类问题的利器。它提供了简单直观的...
在地理信息系统(GIS)领域,坐标系的理解与...总之,这个工具集合对于那些需要在不同坐标系间处理shp数据的GIS工作者来说,是一个高效且实用的解决方案,能够帮助他们跨越坐标系的障碍,轻松实现数据的共享和应用。
目前,网上也有一些其它的坐标转换工具,但它们很可能会改变shp数据转换前后结构的一致性。而这款工具就没有这种问题,甚至你都不要安装GIS软件,就可以在本地快速进行shp数据的坐标转换! 一、功能描述 1.支持WGS84...
1. **XML配置文件**: 在构建左侧树的过程中,首先需要定义一个XML配置文件,该文件用于描述树的结构以及每个节点的信息。这些信息包括但不限于节点的ID、名称、图标、链接等属性。 - 示例配置文件可能包含以下结构...
2. 文档类型:这是一个使用说明书,根据描述,手册包含了安装、拆卸和操作指南。 3. 多语言标识:文档内容包括了多种语言的表达方式,表明这是一个多语言版本的说明书,适用于不同语言的用户。具体包括了德语(DE)...
例如,`BLMapCoordinatesChangeHelper-master`这个项目可能包含了一个名为`BLMapCoordinatesChangeHelper`的Swift类,该类提供了将BD-09、GCJ-02与WGS84之间互相转换的功能。 在实际应用中,可能会有以下几种转换...
如果你需要在中国使用GPS数据,你需要将接收到的WGS84坐标转换为GCJ02,然后再根据所使用的地图服务(如百度地图)转换为BD09坐标。反之,如果你想将国内的坐标数据分享给海外用户,需要将GCJ02或BD09转换回WGS84。 ...
下载下来,放到src/utils路径下面 需要用到的组件里面 import gcoord from ‘@/utils/gcoord.js’ const result = gcoord.transform( this.currentLocation, // 经纬度坐标 gcoord.GCJ02, // 当前坐标系 gcoord....
根据提供的文件信息,我们可以推断出这是一份关于电气设备安装的手册——“使用说明 BD2”。这份手册包含了多语言的安全警告以及安装指导,适用于不同的国际标准。下面将详细解析这些信息中的关键知识点。 ### 标题...
汽车GYJ-0010_汽车0BD接口转换模块资料及相关协议,支持ISO9141-2、ISO14230(KWP)、ISO15765(CANBUS)等协议的物理层,可通过OBD-16标准接口与现有绝大部分汽车的ECU进行诊
在微信小程序开发中,"排队取号,map组件使用小程序源码.zip" 是一个非常实用的应用场景,它涉及到地图服务的集成以及用户交互的设计。在这个项目中,开发者使用了微信小程序的地图组件(Map Component)来实现用户...