0

我有两个 ibatis sql 映射,它们通过子选择链接在一起,如下面的简化示例:

<resultMap id="order" class="Order">
  <collection property="orderLines" ofType="OrderLine" resultMap=”orderLine”/>
</resultMap>

我有一个订单对象,其中包含由连接和关联返回的线对象集合。我希望在返回订单行的嵌套关联返回的每一行上执行一些行处理程序功能。

我知道这可以通过在调用 spring sqlmapclienttemplate以仅查询 OrderLine 对象列表时将IListRowHandler传递给queryWithRowHandler调用来实现,但这不允许我在调用时在子选择集合上使用行处理程序仅在父 sql 映射上,本例中为 order。

有什么方法可以声明性地将 rowhandler 类分配给特定的 resultmap 或 ibatis sql 映射中的 select 语句?因为这是我觉得应该存在的那种功能。或者,我对修改子选择返回的行对象的每个实例的建议持开放态度,因为它们被返回,而不是询问完全构建的订单对象并在事后操纵它们。

4

2 回答 2

1

听起来您正在使用 N+1 选择方法,即使对于简单的查询,这也可能导致执行大量选择,这通常是不可取的。请参阅 iBatis 用户指南中的“关联的嵌套结果”部分,该部分提供了该问题的替代解决方案,基本上您可以在主查询中进行连接,然后在 resultMap 级别使用聚合映射到您的对象模型,因此您可以简单地在主查询上使用行处理程序。

于 2009-12-10T18:52:40.377 回答
1

我已经浏览了 iBatis 文档,以寻找适合但没有成功的东西。

所以我实施了以下解决方案:

Order.setOrderLines(collection orderLines)作为查询执行结果通过 ibatis 填充的方法上,我已经实现了一个处理程序方法,该方法处理orderLines即将在Order.

这并没有实现每个嵌套对象在实例化时和在添加到集合之前的拦截,但它完成了这项工作,并足够早地以与查询无关的方式执行它,以便它在任何时候被激活查询使用OrderresultMap 作为返回值。

我很高兴将执行我最初想要的任务的任何声明性类型的解决方案标记为答案,如果有人提出一个!

于 2009-12-11T09:31:33.090 回答