我需要一些帮助,我试图使用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();
}
答案 0 :(得分:1)
我想你是通过mapper接口执行的,方法是:Public
这显然需要一个结果,因为这不是一个集合类型,而是你得到的错误。
但我并没有告诉你应该更改为ParentObject getChildren();
以避免此错误......或者你应该......暂时,因为这有助于理解问题:
使用您的代码Mybatis为每个结果行创建一个新的ParentObject,因为永远不会返回parentId,Mybatis不会假设您拥有单个父级。然后查询将返回parentId列, ParentObjectMap 以List<ParentObject> getChildren();
开头,以便Mybatis知道如何按父项对子项进行分组。