我有6个像这样的结构表(底部有一个更具描述性的例子):
A
每个项目与B中的一个项目和C中的一个项目相关。
aid | bid | cid
乙
每件商品都与D中的多件商品有关。
bid
C
每件商品都与D中的多件商品有关。
cid
d
每个项目都与B和C中的多个项目相关。
did
电子
将B中的项目映射到D中的项目。
bid | did
˚F
将C中的项目映射到D中的项目。
cid | did
现在我试图在MyBatis中编写一个映射器来映射表A中的项。映射器与表B和C的映射器有关联,表B和C的映射器都有一个集合包含表D的项目。
将B或C单独映射到表D的项目不是问题,因为使用E或F的简单连接操作就足够了。 但是,当尝试从表A的角度映射所有内容时出现问题。 由于表A与表B和C相关联,并且它们都与表D相关联,因此我不知道如何让B和C的映射器区分表D中针对它们的项。
基本上,我试图从A的映射器的角度加入D到B和C.
有没有办法在MyBatis中连接表D两次,同时保持两个连接的区别,这样B和C的映射器可以区分两者?
感谢您的帮助!
修改
这是一个带有更具描述性名称的小例子。
房屋
houseid | livingroomid | kitchenid
1 | 1 | 1
livingrooms
livingroomid
1
厨房
kitchenid
1
家具
furnitureid | furniturename
1 | couch
2 | lamp
3 | fridge
livingroomfurniture
livingroomid | furnitureid
1 | 1
1 | 2
kitchenfurniture
kitchenid | furnitureid
1 | 2
1 | 3
我的地图制作者目前:
Mapper.xml
<?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>
<resultMap type="com.project.models.house.House" id="HouseResult">
<id property="id" column="houseid" />
<association property="livingroom" resultMap="LivingRoomResult" />
<association property="kitchen" resultMap="KitchenResult" />
</resultMap>
<resultMap type="com.project.models.livingroom.LivingRoom" id="LivingRoomResult">
<id property="id" column="livingroomid" />
<collection property="furniture" resultMap="FurnitureResult" />
</resultMap>
<resultMap type="com.project.models.kitchen.Kitchen" id="KitchenResult">
<id property="id" column="kitchenid" />
<collection property="furniture" resultMap="FurnitureResult" />
</resultMap>
<resultMap type="com.project.models.furniture.Furniture" id="FurnitureResult">
<id property="id" column="furnitureid" />
<result property="name" column="furniturename" />
</resultMap>
<select id="getAllHouses" resultMap="HouseResult">
SELECT
houses.houseid,
houses.livingroomid,
houses.kitchenid
FROM houses
-- Get the living room
INNER JOIN livingrooms ON livingrooms.livingroomid = houses.livingroomid
-- Get the kitchen
INNER JOIN kitchens ON kitchens.kitchenid = kitchens.kitchenid
-- Here somehow join the furniture for both the living room and the kitchen?
</select>
</mapper>
答案 0 :(得分:1)
你实际上必须将D加入表B和C,因此将它们作为别名。
假设表d加入B和 cd , bd 。
现在,如果你想为两个别名表(bd和cd)使用表 d 的相同结果图,你可以这样做:
select bd.did as bd_did, cd.did as cd_did
如果您没有遇到结果贴图的column_prefix
属性,那么这就是您的结果图的外观
<collection type="D" resultMap="d" column_prefix="bd_" />