iBatis动态查询Date型返回值问题求援

hexiangmin 发布于 2010/11/04 17:27
阅读 3K+
收藏 1

配置文件如下:
sqlMapConfig部分
<typeHandler javaType="java.sql.Date" jdbcType="DATE" callback="com.dao.TimestampTypeHandlerCallback"/>
<typeHandler javaType="java.util.Date" jdbcType="TIME" callback="com.dao.TimestampTypeHandlerCallback"/>
<typeHandler javaType="java.sql.Timestamp" jdbcType="TIMESTAMP" callback="com.TimestampTypeHandlerCallback"/>
sqlMap配置:
<select id="query" parameterClass="FlowDialUserRpt" resultClass="java.util.HashMap" remapResults="true">
SELECT 
<iterate property="groupFieldsList" conjunction=",">
$groupFieldsList[]$
</iterate>
,
<iterate property="fieldsList" conjunction=",">
$fieldsList[]$
</iterate>
from ( SELECT ROWNUM ROW_ID, T.* FROM (
SELECT 
<iterate property="groupFieldsList" conjunction=",">
$groupFieldsList[]$
</iterate>
,
<iterate property="functionFieldsList" conjunction=",">
$functionFieldsList[]$
</iterate>
from FLOW_DIAL_USER_SUMFLOW_RPT
WHERE DATA_TYPE = #dataType#
<isNotEmpty prepend="AND" property="userAccount">
USER_ACCOUNT=#userAccount#
</isNotEmpty>
<isNotEmpty prepend="AND" property="flowDirection">
FLOW_DIRECTION=#flowDirection#
</isNotEmpty>
<isNotEmpty prepend="AND" property="fromDate">
<![CDATA[ 
UPDATE_DATE>=#fromDate#
]]>
</isNotEmpty>
<isNotEmpty prepend="AND" property="toDate">
<![CDATA[
UPDATE_DATE<=#toDate#
]]>
</isNotEmpty>
<iterate property="groupFieldsList" open="GROUP BY " conjunction=",">
$groupFieldsList[]$
</iterate>
<dynamic prepend="ORDER BY">
<isNotEmpty property="orderStr">
$orderStr$
</isNotEmpty>
</dynamic>
) T
<isNotEqual property="start" compareValue="0">
<isNotEqual property="end" compareValue="0">
WHERE ROWNUM <![CDATA[ < ]]>
= #end#
</isNotEqual>
</isNotEqual>
)
<isNotEqual property="start" compareValue="0">
<isNotEqual property="end" compareValue="0">
WHERE ROW_ID <![CDATA[ > ]]>
= #start#
</isNotEqual>
</isNotEqual>
</select>
现在的问题是:在查询返回值中在oracle中Date型数值,返回到Map中总是被封装为Java.sql.Date类型,改类型有个问题:时间值只能精确到天,而实际需要精确到秒,于是我写了在sqlMapConfig中写了那样的typeHandler ,但是发现该typeHandler总是没有被这个查询调用,这个问题已经困扰两天了,请精通这部分知识的高手赐教!

加载中
0
sdfsadfasd
sdfsadfasd

你只是定义的typeHandler,也没发现你调用啊?


0
h
hexiangmin

是这样的,我定义在全局配置文件中,这个应该是默认全局生效的啊,在我明确定义了Bean的地方跟踪代码的确调用了,就是在用map映射的时候发现没有调用,请问这个如何处理?

0
sdfsadfasd
sdfsadfasd

数据库应该存的是DATE,把3个typeHandler 去掉换成试试

<typeHandler javaType="java.util.Date" jdbcType="DATE" callback="com.dao.TimestampTypeHandlerCallback"/>

0
sdfsadfasd
sdfsadfasd

TimestampTypeHandlerCallback

是你自己写的?实现哪个借口了?

0
h
hexiangmin

实现的是TypeHandlerCallback这个接口,你说的这种方式也不行。这里问题应该是动态Map映射走默认的字段映射关系,而没有调用我们实现的这个接口。

0
sdfsadfasd
sdfsadfasd

那你可以写个JavaBean,把返回值给对象

0
h
hexiangmin

正是因为表结构是动态的无法把Bean写死采用了Map的映射,这个问题已经解决时Oracle10G的问题在9i和11g中都无此问题,可以通过修改iBatis的源码方式实现。

0
callmeHEN
callmeHEN

引用来自“sdfsadfasd”的评论

你只是定义的typeHandler,也没发现你调用啊?


是啊
返回顶部
顶部