将MyBatis ResultMap中的非列参数传递给嵌套选择

时间:2014-08-14 08:40:53

标签: java sql mybatis

我的域模型中有一对多的关系,我基本上想要阅读Foos和一个过滤的Bars集合,其中一个MyBatis select语句使用嵌套的select { {1}}。

解释一下:我的域模型类看起来或多或少像这样(当然真正的域模型更复杂,但我的问题归结为这个):

Bars

现在,我想阅读public class Foo { private String name; private Set<Bar> bars; // getters and setters omitted } public class Bar { private String color; // getters and setters omitted } ,其中某个名称带有某种颜色的Foos

Bars

MyBatis XML Mapper文件的相关部分如下所示:

public interface FooRepository {
  public List<Foo> selectFoosWithBars(String name, String color);
}

除了<select id="selectFoosWithBars" resultMap="fooResult"> SELECT f.id f_id, f.name f_name FROM foos f WHERE f.name = #{name} </select> <select id="selectBars" resultMap="barResult"> SELECT b.color b_color FROM bars b JOIN foos f ON (b.f_id = #{id}) WHERE b.color = #{color} </select> <resultMap id="fooResult" type="Foo"> <result property="name" column="f_name"> <collection property="bars" select="selectBars" column="f_id" /> </resultMap> <resultMap id="barResult" type="Bar"> <result property="color" column="b_color" /> </resultMap> SELECT中的#{color}参数外,一切正常。我可以在第一个selectBars中使用颜色参数而没有任何问题,但是如何将参数传递给嵌套的selectFoosWithBars

请注意,我目前正在尝试对SQL进行性能调优,而在第一个SELECT中简单地加入selectBarsbars表是不可能的。

2 个答案:

答案 0 :(得分:1)

这在mybatis中是不可能的。

mybatis使用的算法如下:

  1. 执行查询selectFoosWithBars
  2. 表示结果中的每一行
    1. 执行selectBars
    2. 将结果放入bars集合
  3. 问题在于,Foos的结果集合与步骤1中返回的集合相同,并且不会进一步过滤。

    您可以尝试使用not exists重写查询,以使查询在功能上等效于加入。它可能会更好,然后加入请参阅herehere

答案 1 :(得分:0)

如果我正确地阅读了这个,那么我在这里讨论的解决方案相同:

how to pass a constant value to nested column with mybaits association

应该有效。您可以通过从selectFoosWithBars选择中选择它来将其作为列属性传递。