2

为了解决这个问题,我削减了很多代码。

当我尝试不同的方法来让这个集合正常工作时,我继续收到这个错误:

嵌套异常是 org.apache.ibatis.exceptions.TooManyResultsException: 期望 selectOne() 返回一个结果(或 null),但发现:2

相关对象如下:

class Recipe {
    String name
    List<RecipeIngredient> ingredients
}
class RecipeIngredient {
    Double measurementAmount
}

我的方法调用有一个接口:

public interface CookbookDao {
    public Recipe getRecipe(@Param("id")int id)
}

我的结果映射器:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="cookbook.daos.CookbookDao">
    <select id="getRecipe" resultMap="Recipe">
        SELECT
          r.name,
          ri.measurement_amount
        FROM
          recipe r
          INNER JOIN recipe_ingredient ri on ri.recipe_id = r.id
        WHERE
          r.id = #{id}
    </select>

    <resultMap id="Recipe" type="cookbook.domain.Recipe">
        <result property="name" column="r.name" />
        <collection property="ingredients" ofType="cookbook.domain.RecipeIngredient">
            <result property="measurementAmount" column="ri.measurement_amount"/>
        </collection>
    </resultMap>
</mapper>

查询返回以下结果(注意:虽然上面的代码只有“measurement_amount”,但我已经包含了实际的最终结果集,以帮助说明为什么我想要/需要取回这两行):

 name | measurement_amount | name | abbreviation | name  
------+--------------------+------+--------------+-------
 Rice |                  1 | cup  |              | rice
 Rice |                  2 | cups |              | water

当我拿出收藏品时,我可以让映射器工作。我尝试过使用 javaType 并尝试使用集合中的复合键,但它仍然不起作用。我已经用完了想法并查看了大量的帮助帖子,但没有什么特别突出的。

我正在使用带有 UTD 版本的 mybatis 和 mybatis-spring 的 Spring Boot

4

2 回答 2

3

事实证明,MyBatis 不理解我与别名表的关联,所以我将查询更改为:

SELECT
  r.name as recipe_name,
  ri.measurement_amount as measurement_amount
FROM
  recipe r
  INNER JOIN recipe_ingredient ri on ri.recipe_id = r.id
WHERE
  r.id = #{id}

并更新映射器以使用列的别名(recipe_name 而不是 ri.name 等),如下所示:

<resultMap id="Recipe" type="cookbook.domain.Recipe">
    <result property="name" column="recipe_name" />
    <collection property="ingredients" ofType="cookbook.domain.RecipeIngredient">
        <result property="measurementAmount" column="measurement_amount"/>
    </collection>
</resultMap>

它奏效了!

感谢那些评论帮助的人

于 2016-03-19T17:44:00.230 回答
-2

你可以尝试使用List.

public interface CookbookDao {
    public List<Recipe> getRecipe(@Param("id")int id);
}
于 2017-06-11T14:32:48.797 回答