关于Mybatis一对多查询以及返回一条记录的经验总结

前人经验

关于一对多返回一条的问题:原因是在于多张表有列名相同的字段、

如果在数据库中使用连接操作(如 INNER JOIN、LEFT JOIN、RIGHT JOIN 等)进行连接时,列名有相同的字段,则在连接结果集中,这些列名相同的字段会被合并为一个字段。合并后的字段将包含两个或多个原始列中的数据,并且需要使用表别名或列别名来进行区分。
如果不使用别名来区分,可能会导致查询结果不正确、数据重复或数据缺失的问题。因此,在进行数据库连接时,正确设置别名是非常重要的。

resultmap结果映射是在sql的执行结果中再次进行映射,根据执行结果的列名与'property'属性进行映射。所以映射的属性必须是sql执行结果中存在的列名!

本次实践和经验总结

我的配置:

mysql数据库中

user表主键为id

user_orders表以userid(user表中的id)做为外键

假设一个用户有多个订单

user类(一对多查询,所以user类持有对order集合的引用。

package demo.Entity;

import java.util.List;

public class user {

    private  String my_name;
    private  int my_age;
    private  String my_email;
    private  int uid;
    private List<order> ordersOfUsers;


    public String getMy_name() {
        return my_name;
    }

    public void setMy_name(String my_name) {
        this.my_name = my_name;
    }

    public int getMy_age() {
        return my_age;
    }

    public void setMy_age(int my_age) {
        this.my_age = my_age;
    }

    public String getMy_email() {
        return my_email;
    }

    public void setMy_email(String my_email) {
        this.my_email = my_email;
    }

    public int getId() {
        return uid;
    }

    public void setId(int id) {
        this.uid = id;
    }

    public List<order> getOrdersOfUsers() {
        return ordersOfUsers;
    }

    public void setOrdersOfUsers(List<order> ordersOfUsers) {
        this.ordersOfUsers = ordersOfUsers;
    }

    @Override
    public String toString() {
        return "user{" +
                "my_name='" + my_name + '\'' +
                ", my_age=" + my_age +
                ", my_email='" + my_email + '\'' +
                ", id=" + uid +
                ", ordersOfUsers=" + ordersOfUsers.toString() +
                '}';
    }
}

resultmap 结果关联映射 在.xml中(通过 user 表left join 左连接 order表)

     <resultMap id="AllOrdersAboutUsers" type="demo.Entity.user">
        <id property="uid" column="id" />
        <result property="my_name" column="name"/>
        <result property="my_age" column="age"/>
        <result property="my_email" column="email"/>
        <collection property="ordersOfUsers" ofType="demo.Entity.order">
            <id  property="userid" column="userid" />
            <result property="goodsname" column="goodsname"/>
            <result property="account" column="accounts"/>
            <result property="orderid" column="orderid"/>
        </collection>


    </resultMap>

    <select id="AllOrdersAboutUser" resultMap="AllOrdersAboutUsers">

        select
        user.*,
        user_orders.*
        from  user  LEFT JOIN   user_orders   ON  user.id=user_orders.userid
        where user.id=0;




    </select>

关注于以下两个框。

第一种情况(user_orders.userid并不在sql的执行结果中,但它是外外键,本质是user.id)

返回结果正确

发现我并没有返回user_orders.userid(外键),但结果正确。

第二种情况(userorders_userid在sql的执行结果中)

返回结果错误:没把多个order对象整合到集合类中.而是返回两个id相同的user对象。

第三种情况:(对比第一种情况)

结果和第二种情况一样

第四种情况:(两表的外键和主键同时存在,第一个框的column可以user.id或user_orders.userid

返回结果正确

以上的四种情况在resultmap的collection标签中,若不是表.属性的名字,则都返回错误的数据

总结:

  1. 第一种情况不在初学者的意料之内

  1. 第二种情况不在初学者的意料之内

  1. 第三种情况不在初学者的意料之内

  1. 第四种情况则都认同。

  1. 所以,当涉及一张表的主机与另一张表的外键进行联立时,若需求需要返回第一张表的主键,则在sql的执行结果中明确要求返回第一张表的主键,同时在<collection>的id属性中使用第一张表的主键并以表名.属性的形式进行约束。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你可以使用以下SQL语句来实现这个功能: ```sql SELECT DISTINCT id, column1, column2, ... FROM your_table; ``` 其中,`your_table`是你要查询的表,`id`是你要去重的列,`column1`、`column2`等是其他要查询的列。`DISTINCT`关键字可以保证只返回不同的`id`值,而不返回重复的记录。 ### 回答2: 有多种方法可以实现只取其中一条id相同的记录的SQL语句,下面给出两种常用的方法: 方法一:使用子查询和ROWNUM/RANK函数 ```sql SELECT * FROM ( SELECT id, column1, column2, ROWNUM rn FROM your_table WHERE id = your_id ORDER BY your_order_column -- 根据某一列排序 ) WHERE rn = 1; ``` 此方法使用了Oracle数据库中ROWNUM或ROW_NUMBER函数来给每一行分配一个行号,在子查询中按照你所要求的顺序进行排序,然后在外层查询中筛选出行号为1的记录。 方法二:使用GROUP BY和聚合函数 ```sql SELECT id, MIN(column1) AS column1, MIN(column2) AS column2 FROM your_table WHERE id = your_id GROUP BY id; ``` 此方法使用了GROUP BY子句将相同id的记录分组,并使用MIN函数取每个分组中的最小值作为结果,这样就只会返回每个id相同的记录中的一条。 注意:在上述例子中,"your_table"是你的表名,"your_id"是你想筛选的id值,"column1"、"column2"等是你想要的其他列名。 ### 回答3: 对于多条id相同的记录,如果只想取其中一条记录,可以使用以下的 SQL 语句: SELECT * FROM 表名 WHERE id IN (SELECT id FROM 表名 GROUP BY id); 其中,"表名" 是你所操作的表的名称,"id" 是代表记录的唯一标识符的列名。 以上语句的解释如下:首先,内层的 SELECT 语句通过 GROUP BY 子句将所有相同 id 的记录分组。然后,外层的 SELECT 语句使用 IN 子句过滤出这些相同 id 的记录,并返回所有相关的列。 注意:由于是随机选择其中一条记录,所以结果是不确定的。如果想要指定选择哪一条记录,可以在内层的 SELECT 语句中使用其他的聚合函数,比如 MAX() 或 MIN() 来确定要选择的记录。 希望以上回答对您有所帮助,如有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值