在MyBatis中以不同的关联映射相同的表两次

时间:2017-08-15 09:12:28

标签: java sql postgresql mybatis

我有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>

1 个答案:

答案 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_" />