【问题标题】:Composite keys in MyBatis <collection> mappingsMyBatis <collection> 映射中的复合键
【发布时间】:2015-01-17 03:54:52
【问题描述】:

我无法将复合键传递给 MyBatis &lt;collection&gt; 元素(使用版本 3.2.7)。 MyBatis documentation 声明:

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

但是,我所有尝试实现它都会产生异常

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.&lt;init&gt;()

集合(位于另一个 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,但我无法弄清楚如何为两个键正确构造列属性。有什么想法吗?

【问题讨论】:

    标签: mybatis composite-key


    【解决方案1】:

    当有多个参数时,MyBatis 会因为使用parameterType 而感到困惑。像这样修改你的查询映射:

    <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>
    

    【讨论】:

    • 只需删除 parameterType 属性并保持上述所有其他内容即可解决,谢谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 2019-04-22
    • 1970-01-01
    相关资源
    最近更新 更多