Return 来自 myBatis (Java) 的列表(对象内部)

Return a list (inside an object) from myBatis (Java)

我在这里需要一些帮助,我正在尝试 return 使用 myBatis 在父对象中的对象列表。

问题:

在你开始阅读下面的代码之前 - 我得到的错误是:

SqlSession operation; nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 4102

这里有趣的是,这不知何故意味着我正在访问存储过程,看到那里的数据量,并且由于结果太多而出错,因为 myBatis 认为我正在使用 selectOne() - 这不是真的?我要补充一点,4102 是 table 我试图从中提取此数据的确切记录数。

我的代码:

这是父对象和子对象的结果映射:

<resultMap id="ParentObjectMap" type="com.company.product.mybatis.model.ParentObject">
    <collection property="children" resultMap="childrenMap"/>
</resultMap>

<resultMap id="childrenMap" type="com.company.product.mybatis.model.ChildObject">
    <id column="ChildId" jdbcType="BIGINT" property="childId" />
    <result column="Name" jdbcType="VARCHAR" property="name" />
</resultMap>

这是上述每张地图的代码。

public class ParentObject implements Serializable {

    private long id;
    private List<ChildObject> childrenMap;

    /* GETTERS AND SETTERS EXCLUDED FOR BREVITY. */
}

子对象的 class:

public class ChildObject implements Serializable {

    private long childId;
    private String name;

    /* GETTERS AND SETTERS REMOVED FOR BREVITY. */
}

这是我正在调用的存储过程,旨在 return 数据:

ALTER PROCEDURE dbo.PR_Children_Get
AS

SET NOCOUNT ON

BEGIN
    SELECT 
        tp.ChildId,
        tp.Name
    FROM dbo.Children tp WITH (NOLOCK)
END
GO

下面是我在映射器中执行该过程的方式:

<select id="getChildren" resultMap="ParentObjectMap">
    exec [dbo].[PR_Children_Get]
</select>

这是我访问映射器的界面:

@Override
public ParentObject getChildren() throws Exception {
    ParentObject result = ParentObjectMapper.getChildren();
    return result;
}

这是 ParentObjectMapper 的接口:

/* Hiding imports for brevity */

public interface ParentObjectMapper {

    // Get the list children, the list should be a property within the parent object.
    ParentObject getChildren();
}

我想你是通过映射器接口执行的,方法是:ParentObject getChildren(); 这明确期望一个结果,因为这不是集合类型,然后是你得到的错误。

但我并不是告诉您应该更改为 List<ParentObject> getChildren(); 以避免此错误...或者您可能应该...一段时间,因为这有助于理解问题:

使用您的代码,Mybatis 会为每个结果行创建一个新的 ParentObject,因为 parentId 永远不会 returned 并且 Mybatis 不会假设您有一个 parent。然后查询应该 return 一个 parentId 列和 ParentObjectMap<id column="parentId" property="id"/> 开头,这样 Mybatis 就知道如何分组 children通过他们 parent.