V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
牛客网
gzk329
V2EX  ›  Java

[求助] Mybatis 里边可以使用 collection 标签里边嵌套 association 标签嘛 如果可以的话我这个写的哪里有问题? 详细在文中

  •  
  •   gzk329 · 49 天前 · 591 次点击
    这是一个创建于 49 天前的主题,其中的信息可能已经有所发展或是发生改变。
    public class Employee {
        private String eid;
        private String name;
        private Date startTime;
        private Manager manager;
    
    public class Manager {
        private String mid;
        private String name;
        private Employee employee;
    
    

    数据表结构

    我现在写了一个方法要通过经理的 ID 查出经理 同时一个经理对象里边会有对应的多个雇员,然后雇员对象里边还有对应的经理信息 可以使用 collection 标签里边嵌套 association 标签嘛 如果可以的话我这个写的哪里有问题?

        <select id="getEmployeeByManagerId" resultMap="managerMap">
            select * from
            employee e, manager m
            where m.id = e.mid
            and m.id = #{id};
        </select>
        <resultMap id="managerMap" type="com.gzk.pojo.Manager">
            <result property="mid" column="id"/>
            <result property="name" column="name"/>
            <collection property="employee" ofType="com.gzk.pojo.Employee">
                <result property="eid" column="id"/>
                <result column="name" property="name"/>
                <result property="startTime" column="startTime"/>
                <association property="manager" column="mid" >
                    <result column="id" property="mid"/>
                    <result property="name" column="name"/>
                </association>
            </collection>
        </resultMap>
    </mapper>
    
    7 条回复    2020-09-10 15:49:45 +08:00
    gzk329
        1
    gzk329   49 天前
    ```
    [Manager(mid=051b89f3b6bd45aea71252ed16f1e5d0, name=赵六, employee=Employee{eid='051b89f3b6bd45aea71252ed16f1e5d0', name='赵六', startTime=Wed Sep 02 15:08:56 CST 2020, manager=null}),
    Manager(mid=3aa1491a4adb47f89b0f7dab804bd9d9, name=李四, employee=Employee{eid='3aa1491a4adb47f89b0f7dab804bd9d9', name='李四', startTime=Sun Aug 02 15:08:47 CST 2020, manager=null})]
    ```
    如果去掉 association 标签的话是可以查出来的 就是查出来的雇员对象里边的经理信息没有了
    gzk329
        2
    gzk329   49 天前
    还有两张表如果有同名的列
    比如 a 表有一列 id
    b 表也有一列也叫 id
    mybatis 里边该怎么区分
    除了起别名?
    luhe
        3
    luhe   49 天前
    是 List<Employee>吧
    wysnylc
        4
    wysnylc   49 天前
    真不怕 N+1 啊
    gzk329
        5
    gzk329   49 天前
    @luhe 是的 这个我已经改好了 但是不知道怎么读出经理信息

    ```
    [Manager(mid=8179d370bff14f5b996023fce00745de, name=李经理, employee=[Employee{eid='051b89f3b6bd45aea71252ed16f1e5d0', name='赵六', startTime=null, manager=null}, Employee{eid='3aa1491a4adb47f89b0f7dab804bd9d9', name='李四', startTime=null, manager=null}])]
    ```

    ```
    <select id="getEmployeeByManagerId" resultMap="managerMap">
    select m.id mid, m.name mName,e.id eid,e.name eName from
    employee e, manager m
    where m.id = e.mid
    and m.id = #{id};
    </select>
    <resultMap id="managerMap" type="com.gzk.pojo.Manager" >
    <result property="mid" column="mid"/>
    <result property="name" column="mName"/>
    <collection property="employee" ofType="com.gzk.pojo.Employee" >
    <result property="eid" column="eid"/>
    <result column="eName" property="name"/>
    <result property="startTime" column="startTime"/>
    <!--<association property="manager" column="mid" >
    <result column="mid" property="id"/>
    <result property="name" column="mName"/>
    </association>-->
    </collection>
    </resultMap>

    ```
    mmdsun
        6
    mmdsun   49 天前 via Android
    不如单表查,然后手动循环查。

    mybatis 一对多关联基本没人用 虽然有一二级缓存但本质还是 n+1 致命的是还会导致某些分页插件计算不准。

    jpa 这种一对多关联的 idea 可以自动生成。
    Jrue0011
        7
    Jrue0011   48 天前
    这循环引用。。。或许是你的 association 标签没有指定属性 javaType="com.gzk.pojo.Manager"
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4454 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 07:12 · PVG 15:12 · LAX 00:12 · JFK 03:12
    ♥ Do have faith in what you're doing.