关于mybatis一对一查询,一对多查询遇到的错误


springboot整合mybatis项目
博客系统
文章,相册,评论,标签,等表
IDEA为最新版2021.3.3,mysql数据库为最新版Navicat
(或许有些字段不支持特定的命名)


也是醉了,以前idea还是19版的,navicat也是老版本的时候mybatis关联查询mapper操作能正常运行,拿到相应字段,并封装,但最近写项目过程中遇到一个离谱的是,过了好久才发现,

当关联查询时,无论一对一还是一对多
除了需要注意javaType和ofType之外,还应该注意各表主键不能同一名称

实体类文章

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Article implements Serializable {

    private Integer id;
    private Integer authorId;
    private String title;
    private String content;
    private Timestamp date;//private LocalDate date;

    private Users user;

    private List<Comment> commentList;
    private List<ArticleTag> articleTagList;

}

接下来是对文章进行操作,要求查询全部文章,并关联查询作者,文章标签(一个文章多个标签)

先看一下我下面代码块的写法,注意一对一,一对多的各个实体查询时的id,都是拿的数据库的id字段,只有标签被我改为了tag_id

在这里插入图片描述

<select id="queryAllArticles" resultMap="ArticleList">
        select a.*,u.*,t.*
        from article a
                 join users u on a.authorid = u.id
                 left outer join article_tag t on a.id = t.article_id

    </select>
    <resultMap id="ArticleList" type="article">
        <id column="id" property="id"/>
        <result column="authorid" property="authorId"/>
        <result column="title" property="title"/>
        <result column="content" property="content"/>
        <result column="date" property="date"/>
        <association property="user" javaType="users">
            <id column="id" property="id"/>
            <result column="pet_name" property="petName"/>
            <result column="headportrait" property="headPortrait"/>
        </association>
        <collection property="articleTagList" ofType="articleTag">
            <id column="tag_id" property="tagId"/>
            <result column="article_id" property="articleId"/>
            <result column="tag_content" property="tag"/>
        </collection>
    </resultMap>

如下图
所以当我测试的时候能正常根据id拿到每张表的同一主键名称id吗

并不能拿到
控制台仅仅正确输出了标签list中的tag_id,没错,细心点,我也是最后才发现,它nn的,上面输出的user(文章作者)他的id封装错了,他的id是这篇文章的id,所以,sql我自此所有表的主键不都全命名为id了,防止此处再烙下病根,而且数据库字段在命名时,我发现字段名字为describe和tag都查不到数据,本来想简简单单命名的数据库表,也得上心了拜拜了~~改bug去了🥲😭🥲😭✍️✍️
///
1看控制台输出/

我的用户表里就没有id为56的user
article

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: MySQL 分区列必须是主键中的一个,因为主键是唯一标识一条记录的关键字,如果分区列不是主键中的一个,那么可能会出现重复的分区,导致数据不一致。同时,将主键作为分区列还能够提高查询效率,因为分区能够快速定位到数据所在的分区。 ### 回答2: 在MySQL中,分区是用来将大型表拆分为更小的、易于管理的部分的一种方法。而分区列是一种指定如何将表拆分成分区的方式。为什么MySQL中的分区列必须是主键中的一个呢? 首先,主键是用来唯一标识表中的每一条记录的。由于分区是用来将表拆分为多个较小的部分,每个部分中的记录数应该相对较少,这样可以提高查询性能。而主键作为唯一标识,保证了每个记录都有一个唯一的标识符,这样可以确保分区的准确性和一致性。 其次,MySQL利用分区来进行查询优化。通过将表拆分为多个分区,可以让查询只在特定的分区上进行,而不需要扫描整个表。这样可以大大提高查询效率。而主键作为唯一标识,在查询过程中可以帮助MySQL确定查询的范围,从而缩小搜索空间,提高查询效率。 此外,MySQL中的分区还支持分区交换操作。通过分区交换,可以在不影响其他分区的情况下,将某个分区的数据与另一个空分区进行交换。这在数据归档、数据删除等场景中非常有用。而主键作为唯一标识,可以确保交换操作的准确性和一致性。 综上所述,MySQL中的分区列必须是主键中的一个,是为了保证分区的准确性、一致性,提高查询性能,并支持分区交换操作。 ### 回答3: MySQL的分区是一种将大的表拆分成小的独立分区,并分散存储在不同物理位置上的技术。为了实现分区的高效、可行,MySQL要求分区列必须是主键中的一个。以下是为什么要求分区列是主键中的一个的原因: 1. 查询性能优化:主键是表上的唯一标识,基于主键的查询效率往往更高。根据分区列进行查询时,MySQL能够通过在具体分区上执行查询,从而减少扫描的数据量和减少磁盘IO数量,提高查询的性能。 2. 分区策略简化:以主键作为分区列可以简化分区策略的设计和实施。主键是表上的唯一标识,根据主键值可以方便地将数据分配到相应的分区上。相比其他列作为分区列,使用主键作为分区列可以降低分区管理和维护的复杂性。 3. 数据一致性保证:将分区列设为主键,可以确保在表中插入或删除数据时,保持数据的一致性。分区列作为主键后,MySQL会对分区键进行检查以确保每个分区中的数据唯一。这有助于避免数据重复或数据丢失的情况。 总之,MySQL要求分区列必须是主键中的一个,是为了提高查询性能、简化分区策略和保证数据一致性。这样设计可以使分区功能有效地应用于大型表,提高数据库的处理能力和性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

roydon_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值