我有两个ibatis sql地图,它们通过子选择链接在一起,如下面的简化示例所示:
<resultMap id="order" class="Order">
<collection property="orderLines" ofType="OrderLine" resultMap=”orderLine”/>
</resultMap>
我有一个订单对象,其中包含由连接和关联返回的行对象的集合。我希望在返回订单行的嵌套关联返回的每一行上执行一些行处理程序功能。
我知道这可以通过在调用spring sqlmapclienttemplate 进行查询时将 IListRowHandler 传入 queryWithRowHandler 调用来实现。 OrderLine对象的列表,但是这不允许我在仅在父sql映射上进行调用时在subselect集合上使用rowhandler,在此示例中按顺序排列。
有没有办法以声明方式将rowhandler类分配给ibatis sql map中的特定resultmap或select语句?因为这是我觉得应该在那里的功能。或者我可以建议修改由子选择返回的行对象的每个实例作为它们被返回而不是询问完全构建的订单对象并在事后操纵它们。
答案 0 :(得分:1)
听起来你正在使用N + 1选择方法,这可能导致即使对于简单查询也会执行大量选择,这通常是不可取的。请参阅iBatis用户指南中的“关联的嵌套结果”部分,该部分提供了该问题的替代解决方案,基本上您可以在主查询中进行连接,然后在resultMap级别使用聚合映射到对象模型,因此在结果中可以在主查询上使用行处理程序。
答案 1 :(得分:1)
我已经浏览了iBatis文档,了解了哪些内容没有成功。
所以我实施了以下解决方案:
在作为查询执行结果通过ibatis填充的Order.setOrderLines(collection orderLines)
方法中,我实现了一个处理程序方法,该方法操作即将设置的集合中的每个orderLines
Order
。
这不会实现拦截每个嵌套对象,因为它被实例化,并且在它被添加到集合之前,但它完成了工作,并且以足够早的方式执行它并以查询不可知的方式执行它以便激活它任何时候查询都使用Order
resultMap作为返回值。
我很高兴能够标记任何执行任务的声明式解决方案,因为如果有人提出这个解决方案,我会首先想要这个解决方案!