有一个简单的select
<select id = "getWidgetConfig" resultType="com.comp.entity.widgets.cnfg.Widget">
SELECT `json_config`
FROM `widget_config`
WHERE `widget_id` = #{widgetId}
</select>
其中json_config
是字符串值。
我可以绑定类型/结果处理程序(内联)来使用我的处理程序将json_config值转换为实体小部件吗?
我可以对update/insert语句内联执行此操作
INSERT INTO `widget_config`
(
`json_config`
)
VALUES
(
#{widget,typeHandler=com.comp.mybatis.handlers.widget.WidgetTypeHandler}
)
如何对select语句执行类似的操作?谢谢
发布于 2015-05-30 04:57:40
我不认为在select中使用顶级类型处理程序是可能的。但是您可以通过使用带构造函数的结果映射来实现这一点:
<resultMap id="widgetMap" type="Widget">
<constructor>
<arg column="json_config" javaType="string"/>
</constructor>
</resultMap>
<select id="getWidgetConfig" resultMap="widgetMap">
SELECT `json_config`
FROM `widget_config`
WHERE `widget_id` = #{widgetId}
</select>
潜在的缺点是,您需要在Widget
的构造函数中具有解析逻辑。如果这不是一个选择,一种克服它的方法是为Widget
创建复制构造函数,并像这样更改映射:
<resultMap id="widgetMap" type="Widget">
<constructor>
<arg column="json_config" javaHandler="com.comp.mybatis.handlers.widget.WidgetTypeHandler"/>
</constructor>
</resultMap>
您需要确保Widget
具有适当的复制构造函数,该构造函数接受Widget
类型的值并创建一个副本(如果传递的Widget
内部是不可变的,它可能会重用这些内部构造函数)。
https://stackoverflow.com/questions/30465681
复制相似问题