MyBatis <collection> mappings </collection>中的复合键

时间:2014-11-19 15:04:13

标签: mybatis composite-key

我无法将复合键传递给MyBatis <collection>元素(使用版本3.2.7)。 MyBatis documentation州:

  

注意:要处理组合键,可以使用语法column =&#34; {prop1 = col1,prop2 = col2}&#34;指定多个列名称以传递给嵌套的select语句。这将导致prop1和prop2针对目标嵌套select语句的参数对象设置。

但是,我实现此操作的所有尝试都会产生异常

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: Error instantiating class java.lang.Integer with invalid types () or values (). Cause: java.lang.NoSuchMethodException: java.lang.Integer.<init>()

该集合(位于另一个ResultsMap中)是:

<collection property="foos" ofType="FooObject"
    column="{param1=user_id,param2=foo_id}" select="getFoosByUser" >
        <id property="userId" column="user_id" />
        <id property="foo" column="foo_id" />
        <result property="fooName" column="foo_name" />
</collection>

它应该返回Foo对象的ArrayList。组合键是user_id和foo_id。选择查询是:

    <select id="getFoosByUser" parameterType="Integer" resultType="FooObject">
        SELECT
          user_id AS userId,
          foo_id AS fooId, 
          foo_name AS fooName
        FROM foo_table
        WHERE user_id = #{param1}
        AND foo_id = #{param2}
    </select>

如果我只使用一个参数,例如,查询就可以正常工作已删除foo_id=#{param2},然后在集合中使用column=user_id,但我无法确定如何正确构造两个键的列属性。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

当有多个参数时,使用parameterType会使MyBatis感到困惑。修改您的查询映射如下:

<select id="getFoosByUser" resultType="FooObject">
    SELECT
      user_id AS userId,
      foo_id AS fooId, 
      foo_name AS fooName
    FROM foo_table
    WHERE user_id = #{param1}
    AND foo_id = #{param2}
</select>