V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
amiwrong123
V2EX  ›  程序员

Mybatis 的 collection 标签可以起到 group by 的作用?

  •  
  •   amiwrong123 · 2020-09-26 16:21:04 +08:00 · 1631 次点击
    这是一个创建于 1279 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一个 java 类;

    @Data
    @Alias("Customer")
    public class Customer {
        private String custName;
        private String address;
        private List<Order> orderList;
    }
    
        <select id="getCustomer" resultMap="CustomerAndOrder">
            select * from test.orders a, test.customers b where a.cust_id = b.cust_id
        </select>
        
        <resultMap id="CustomerAndOrder" type="Customer">
            <result property="custName" column="cust_name"/>
            <result property="address" column="cust_address"/>
            <collection property="orderList" ofType="Order">
                <result property="orderNum" column="order_num"/>
                <result property="orderDate" column="order_date"/>
            </collection>
        </resultMap>
    

    getCustomer 方法是为了查询每个顾客,都有哪些订单。

    执行 getCustomer 方法后,可以看到这个链表查询起到了类似 group by 的作用,以 cust_name 和 cust_address 分组,将每个组内的订单信息弄进了一个集合内。类似于:

    select 
    cust_name, 
    cust_address,
    (select 组内各行的 order_num,order_date into a List)
    from test.orders a, test.customers b where a.cust_id = b.cust_id
    group by cust_name, cust_address
    

    大概是上面这个意思,但实际上 mysql 无法做到这种语句。

    1601108551(1)

    然后我想问的是:

    • 假设(select 组内各行的 order_num,order_date into a List)这种行为支持的话,上面这种查询是否等价于上面这 sql 语句?
    • 如果等价,出现在<result property="xxx" column="yyy"/>的 yyy 一定是 group by 的条件呗?

    另外,mybatis 官方文档的这个例子:

    <!-- 非常复杂的结果映射 -->
    <resultMap id="detailedBlogResultMap" type="Blog">
     <constructor>
       <idArg column="blog_id" javaType="int"/>
     </constructor>
     <result property="title" column="blog_title"/>
     <association property="author" javaType="Author">
       <id property="id" column="author_id"/>
       <result property="username" column="author_username"/>
       <result property="password" column="author_password"/>
       <result property="email" column="author_email"/>
       <result property="bio" column="author_bio"/>
       <result property="favouriteSection" column="author_favourite_section"/>
     </association>
     <collection property="posts" ofType="Post">
       <id property="id" column="post_id"/>
       <result property="subject" column="post_subject"/>
       <association property="author" javaType="Author"/>
       <collection property="comments" ofType="Comment">
         <id property="id" column="comment_id"/>
       </collection>
       <collection property="tags" ofType="Tag" >
         <id property="id" column="tag_id"/>
       </collection>
       <discriminator javaType="int" column="draft">
         <case value="1" resultType="DraftPost"/>
       </discriminator>
     </collection>
    </resultMap>
    

    是否可以认为其等价 sql 语句是 group by blog_title, author_id, author_username, author_password, author_email, author_bio, author_favourite_section?

    3 条回复    2020-09-27 17:23:14 +08:00
    amiwrong123
        1
    amiwrong123  
    OP
       2020-09-27 11:48:47 +08:00
    是我这个问题太低端了吗,还是大家都不喜欢用 mybaits 吗(刚看了隔壁 JPA 和 mybatis 对比贴子~)
    shaoyijiong
        2
    shaoyijiong  
       2020-09-27 16:58:02 +08:00
    其实是太长了没人想看完 包括我
    amiwrong123
        3
    amiwrong123  
    OP
       2020-09-27 17:23:14 +08:00
    @shaoyijiong
    哈哈哈,好吧。晚上我自己再试试吧。忽略最后的那个例子,其实帖子很短啊[手动笑哭]
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   950 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 21:06 · PVG 05:06 · LAX 14:06 · JFK 17:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.