Mybatis xml resultMap 存在集合关联问题
Mybatis xml resultMap with collection and association issue
我其实是在测试mybatis。我真的很喜欢,但是,我想更深入地了解 resultMap,但我遇到了问题。
其实我只是想从数据库中获取一个计算机对象,它由多个屏幕和一个塔组成(我代码的另一个对象)
这是我的计算机 resultMap :
<resultMap type="entity.Computer" id="computer">
<id column="id" property="id"/>
<result column="name" property="name"/>
<association property="tower" column="towerid" resultMap="towerResult" columnPrefix="t_"/>
<collection ofType="entity.Screen" property="screen" javaType="ArrayList" resultMap="screenResult" columnPrefix="s_"/>
</resultMap>
此请求:
<select id="getcomputerById" resultMap="computer">
Select c.id, c.name, c.towerid, s.id as s_id, s.size as s_size, s.type as s_type, s.computer_id as s_computer_id, t.id as t_id, t.ram as t_ram, t.stockage as t_stockage from computer c inner join tower t on t.id = c.towerid left join screen s ON s.computer_id = c.id where c.id=#{computerId}
</select>
使用此代码一切正常。 BUTTTTTTTTT!
我想做的是:
<resultMap type="entity.Computer" id="computer">
<id column="id" property="id"/>
<result column="name" property="name"/>
<association property="tower" column="towerid" select="getTowerbycomputerid"/>
<collection ofType="entity.Screen" property="screen" javaType="ArrayList" resultMap="screenResult" columnPrefix="s_"/>
</resultMap>
唯一不同的是:<association property="tower" column="towerid" select="getTowerbycomputerid"/>
当然,我将我的请求更改为:
<select id="getcomputerById" resultMap="computer">
Select c.id, c.name, c.towerid, s.id as s_id, s.size as s_size, s.type as s_type, s.computer_id as s_computer_id from computer c inner join tower t on t.id = c.towerid left join screen s ON s.computer_id = c.id where c.id=#{computerId}
</select>
有 xml 匹配 getTowerbycomputerid :
<select id="getTowerbycomputerid" resultMap="towerResult">
Select t.id, t.ram, t.stockage from tower t inner join computer c on c.towerid=t.id where c.id=#{computerId}
</select>
结果映射:
<resultMap id="towerResult" type="entity.Tower">
<id property="id" column="id"/>
<result property="ram" column="ram"/>
<result property="stockage" column="stockage"/>
</resultMap>
我不明白为什么第二个结果图不起作用。
如果我有一对一的塔和一对一的屏幕
我可以有一个结果图,有两个关联,其中有一个 select="getmethod"
它完美地工作
但是当我将我的代码更改为具有一对一塔和一对多屏幕时,我不能让 select="getmethod" 用于最后一个关联。
它 return 一对一无效,但一对多工作(使用正确的 select 语句)。
有什么想法吗?
也许做不到?
谢谢:)
我回答了我的问题,@ave 让我走上了正确的道路。
他的评论:应该可以。嵌套的 select getTowerbycomputerid 似乎需要计算机 ID,而您在关联中指定了 column="towerid"。不应该是"id"吗?如果这不是原因,请考虑提供像这样的完整示例。
不完全是这样,但它帮助我找到了解决方案。
有我的要求:
@Select("Select c.id, c.name, c.towerid, s.id as s_id, s.size as s_size, s.type as s_type, s.computer_id as s_computer_id from computer c left join screen s ON s.computer_id = c.id where c.id=#{computerId}")
@ResultMap("ComputerMapper.computer")
public Computer getcomputerById(@Param("computerId") Integer computerId);
这是我的结果图:
<resultMap type="entity.Computer" id="computer">
<id column="id" property="id"/>
<result column="name" property="name"/>
<association property="tower" column="towerid" javaType="entity.Tower" select="getTowerbycomputerid"/>
<collection ofType="entity.Screen" property="screen" javaType="ArrayList" resultMap="screenResult" columnPrefix="s_"/>
</resultMap>
现在是我的 resultMap 和获取塔的请求:
<resultMap id="towerResult" type="entity.Tower">
<id property="id" column="id"/>
<result property="ram" column="ram"/>
<result property="stockage" column="stockage"/>
</resultMap>
<select id="getTowerbycomputerid" resultMap="towerResult">
Select t.id, t.ram, t.stockage from tower t where t.id = #{towerid}
</select>
现在一切正常。
在我到达 select 塔之前:
<select id="getTowerbycomputerid" resultMap="towerResult">
Select t.id, t.ram, t.stockage from tower t inner join computer c on c.towerid = t.id where c.id = #{computerId}
</select>
到此结束。谢谢@ave :)
我其实是在测试mybatis。我真的很喜欢,但是,我想更深入地了解 resultMap,但我遇到了问题。
其实我只是想从数据库中获取一个计算机对象,它由多个屏幕和一个塔组成(我代码的另一个对象)
这是我的计算机 resultMap :
<resultMap type="entity.Computer" id="computer">
<id column="id" property="id"/>
<result column="name" property="name"/>
<association property="tower" column="towerid" resultMap="towerResult" columnPrefix="t_"/>
<collection ofType="entity.Screen" property="screen" javaType="ArrayList" resultMap="screenResult" columnPrefix="s_"/>
</resultMap>
此请求:
<select id="getcomputerById" resultMap="computer">
Select c.id, c.name, c.towerid, s.id as s_id, s.size as s_size, s.type as s_type, s.computer_id as s_computer_id, t.id as t_id, t.ram as t_ram, t.stockage as t_stockage from computer c inner join tower t on t.id = c.towerid left join screen s ON s.computer_id = c.id where c.id=#{computerId}
</select>
使用此代码一切正常。 BUTTTTTTTTT! 我想做的是:
<resultMap type="entity.Computer" id="computer">
<id column="id" property="id"/>
<result column="name" property="name"/>
<association property="tower" column="towerid" select="getTowerbycomputerid"/>
<collection ofType="entity.Screen" property="screen" javaType="ArrayList" resultMap="screenResult" columnPrefix="s_"/>
</resultMap>
唯一不同的是:<association property="tower" column="towerid" select="getTowerbycomputerid"/>
当然,我将我的请求更改为:
<select id="getcomputerById" resultMap="computer">
Select c.id, c.name, c.towerid, s.id as s_id, s.size as s_size, s.type as s_type, s.computer_id as s_computer_id from computer c inner join tower t on t.id = c.towerid left join screen s ON s.computer_id = c.id where c.id=#{computerId}
</select>
有 xml 匹配 getTowerbycomputerid :
<select id="getTowerbycomputerid" resultMap="towerResult">
Select t.id, t.ram, t.stockage from tower t inner join computer c on c.towerid=t.id where c.id=#{computerId}
</select>
结果映射:
<resultMap id="towerResult" type="entity.Tower">
<id property="id" column="id"/>
<result property="ram" column="ram"/>
<result property="stockage" column="stockage"/>
</resultMap>
我不明白为什么第二个结果图不起作用。 如果我有一对一的塔和一对一的屏幕 我可以有一个结果图,有两个关联,其中有一个 select="getmethod" 它完美地工作 但是当我将我的代码更改为具有一对一塔和一对多屏幕时,我不能让 select="getmethod" 用于最后一个关联。 它 return 一对一无效,但一对多工作(使用正确的 select 语句)。
有什么想法吗? 也许做不到?
谢谢:)
我回答了我的问题,@ave 让我走上了正确的道路。
他的评论:应该可以。嵌套的 select getTowerbycomputerid 似乎需要计算机 ID,而您在关联中指定了 column="towerid"。不应该是"id"吗?如果这不是原因,请考虑提供像这样的完整示例。
不完全是这样,但它帮助我找到了解决方案。 有我的要求:
@Select("Select c.id, c.name, c.towerid, s.id as s_id, s.size as s_size, s.type as s_type, s.computer_id as s_computer_id from computer c left join screen s ON s.computer_id = c.id where c.id=#{computerId}")
@ResultMap("ComputerMapper.computer")
public Computer getcomputerById(@Param("computerId") Integer computerId);
这是我的结果图:
<resultMap type="entity.Computer" id="computer">
<id column="id" property="id"/>
<result column="name" property="name"/>
<association property="tower" column="towerid" javaType="entity.Tower" select="getTowerbycomputerid"/>
<collection ofType="entity.Screen" property="screen" javaType="ArrayList" resultMap="screenResult" columnPrefix="s_"/>
</resultMap>
现在是我的 resultMap 和获取塔的请求:
<resultMap id="towerResult" type="entity.Tower">
<id property="id" column="id"/>
<result property="ram" column="ram"/>
<result property="stockage" column="stockage"/>
</resultMap>
<select id="getTowerbycomputerid" resultMap="towerResult">
Select t.id, t.ram, t.stockage from tower t where t.id = #{towerid}
</select>
现在一切正常。 在我到达 select 塔之前:
<select id="getTowerbycomputerid" resultMap="towerResult">
Select t.id, t.ram, t.stockage from tower t inner join computer c on c.towerid = t.id where c.id = #{computerId}
</select>
到此结束。谢谢@ave :)