【问题标题】:Ibatis : Is there a way of adding a rowhandler in an Ibatis resultmap subselect within the sqlmap xml?Ibatis:有没有办法在 sqlmap xml 的 Ibatis 结果映射子选择中添加行处理程序?
【发布时间】:2009-12-10 17:31:47
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: java spring ibatis


    【解决方案1】:

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

    【讨论】:

    • +1 用于关联的嵌套结果,我已经在我拥有的其他查询中使用了它,并且可以对其进行更改以适应。然后我可以在主查询上使用行处理程序,但它返回一个复合订单对象,所以我仍然必须以编程方式依次导航订单行并修改它们。我想知道是否有办法做到这一点,因为它们通过结果图上的处理程序规范加入查询 - 因此在构建该对象的每个实例时被激活。
    【解决方案2】:

    我已经查看了 iBatis 文档,寻找一些适合但没有成功的东西。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 2010-09-12
      • 1970-01-01
      相关资源
      最近更新 更多