从myBatis(Java)

时间:2017-01-20 21:23:07

标签: java mybatis

我需要一些帮助,我试图使用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是我试图从中提取数据的表中的确切记录数。

我的代码:

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

<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. */
}

Child对象的类:

public class ChildObject implements Serializable {

    private long childId;
    private String name;

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

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

ALTER PROCEDURE dbo.PR_Children_Get
AS

SET NOCOUNT ON

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

以下是我在mapper中执行该过程的方法:

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

以下是我访问我的mapper的界面:

@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();
}

1 个答案:

答案 0 :(得分:1)

我想你是通过mapper接口执行的,方法是:Public这显然需要一个结果,因为这不是一个集合类型,而是你得到的错误。

但我并没有告诉你应该更改为ParentObject getChildren();以避免此错误......或者你应该......暂时,因为这有助于理解问题:

使用您的代码Mybatis为每个结果行创建一个新的ParentObject,因为永远不会返回parentId,Mybatis不会假设您拥有单个父级。然后查询将返回parentId列, ParentObjectMap List<ParentObject> getChildren();开头,以便Mybatis知道如何按父项对子项进行分组。