返回顶部
首页 > 资讯 > 后端开发 > Python >SpringJPA联表查询之OneToMany源码解析
  • 131
分享到

SpringJPA联表查询之OneToMany源码解析

SpringJPA联表查询OneToManySpringJPA 2023-05-18 08:05:20 131人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录前言源码单向联表user 实体类house 实体类查询结果双向联表user 实体类house 实体类对象获取前言 我们在实际项目中,除了会碰到一对一的情况,还有一对多的情况,比如

前言

我们在实际项目中,除了会碰到一对一的情况,还有一对多的情况,比如一个用户可以有多辆车,而一辆车只能有一个用户等等,今天我们就来一起学习下 OneToMany(一对多)。

源码

@OneToMany 注解实现一对多关系映射。比如用户跟房子的关系, 一个用户可以有好多房子,而一个房子只能一个用户。
老规矩,实例之前先看看源码:

public @interface OneToMany {
    Class targetEntity() default void.class;
    CascadeType[] cascade() default {};
    FetchType fetch() default LAZY;
    String mappedBy() default "";
    boolean orphanRemoval() default false;
}

注解属性详情请见 注解属性详解,其中需要注意的是 @OneToManyfetch 的默认值是 LAZY

单向联表

我这里所说的单向联表就是只有一方添加注解;通俗讲就是我可以通过 user 获取到其 house 的信息,而不同通过 house 获取到其 user 的信息。

user 实体类

因为对方是 many 多端,所以这边需要用 List 集合

@Entity
@Data
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String name;
    private int age;
    @OneToMany
    @JoinColumn(name = "user_id")
    private List<House> house;
}

house 实体类

@Entity
@Data
public class House {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String addr;
}

小贴士

实例运行之后,大家肯定会发现一个奇怪的问题:user_id 字段明明写在了 user 实体类中,但是实际却添加在 house 表中,这是为啥呢?
因为在 JPA 规范中,一对多的双向关系是由 多端(many) 来维护。就是说 多端(many) 为关系维护端,负责关系的增删改查;一端(one) 则为关系被维护端。

执行请求/user/findById?id=1,控制台打印如下:

Hibernate: 
    select
        user0_.id as id1_2_0_,
        user0_.age as age2_2_0_,
        user0_.name as name3_2_0_ 
    from
        user user0_ 
    where
        user0_.id=?
Hibernate: 
    select
        house0_.user_id as user_id3_1_0_,
        house0_.id as id1_1_0_,
        house0_.id as id1_1_1_,
        house0_.addr as addr2_1_1_ 
    from
        house house0_ 
    where
        house0_.user_id=?

查询结果

User(id=1, name=lili, age=11, house=[House(id=1, addr=江苏南京), House(id=2, addr=江苏无锡), House(id=3, addr=江苏苏州)])

双向联表

我们除了需要通过 user 信息来获取其 house 信息外,有时还需要通过 house 信息来获取其 user 信息。但是需要注意的是 user 对于 house 来说,是一对多;而 house 对于 user 来说,是多对一。这时我们就需要引入另一个联表注解 @ManyToOne,在 house 的实体中添加 user 字段,并添加 @ManyToOne 注解。(这里有一个堆栈溢出的问题需要注意一下,详情请见 JPA 错题集 第二个报错信息)

user 实体类

user 实体中 house 字段

@OneToMany
@JoinColumn(name = "user_id")
@JSONIgnore
public List&lt;House&gt; house;

house 实体类

@ManyToOne
@jsonIgnore
private User user;

执行请求 /house/findById?id=1,控制台打印如下:

Hibernate: 
    select
        house0_.id as id1_1_0_,
        house0_.addr as addr2_1_0_,
        house0_.user_id as user_id3_1_0_,
        user1_.id as id1_2_1_,
        user1_.age as age2_2_1_,
        user1_.name as name3_2_1_ 
    from
        house house0_ 
    left outer join
        user user1_ 
            on house0_.user_id=user1_.id 
    where
        house0_.id=?
2023-04-27 20:35:29.940 TRACE 24272 --- [NIO-7777-exec-6] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [INTEGER] - [1]

对象获取

有同学可能已经发现了,当添加了 @JsonIgnore 这个属性之后
执行请求 /user/findById?id=1,控制台打印如下:

Hibernate: 
    select
        user0_.id as id1_2_0_,
        user0_.age as age2_2_0_,
        user0_.name as name3_2_0_ 
    from
        user user0_ 
    where
        user0_.id=?
[nio-7777-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [INTEGER] - [1]

只取进行用户信息的查询,那我的 house 怎么办呢?别急,我会给你们找回来的!
Usercontrol

@GetMapping("findById")
public Optional<User> findById(int id){
    Optional<User> users = userService.findById(id);
    users.get().getHouse().forEach(v->{
        System.out.println(v.getId() + "-"+ v.getAddr());
    });
    return userService.findById(id);
}

执行请求 /user/findById?id=1,控制台打印如下:

Hibernate: 
    select
        house0_.user_id as user_id3_1_0_,
        house0_.id as id1_1_0_,
        house0_.id as id1_1_1_,
        house0_.addr as addr2_1_1_,
        house0_.user_id as user_id3_1_1_ 
    from
        house house0_ 
    where
        house0_.user_id=?
[nio-7777-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [INTEGER] - [1]
1-南京
2-苏州
3-无锡

以上就是spring JPA联表查询之OneToMany源码解析的详细内容,更多关于Spring JPA联表查询OneToMany的资料请关注编程网其它相关文章!

--结束END--

本文标题: SpringJPA联表查询之OneToMany源码解析

本文链接: https://www.lsjlt.com/news/211878.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SpringJPA联表查询之OneToMany源码解析
    目录前言源码单向联表user 实体类house 实体类查询结果双向联表user 实体类house 实体类对象获取前言 我们在实际项目中,除了会碰到一对一的情况,还有一对多的情况,比如...
    99+
    2023-05-18
    Spring JPA联表查询OneToMany Spring JPA
  • SpringJPA联表查询之OneToOne源码详解
    目录前言源码注解属性单向联表user 实体类car 实体类查询结果双向联表user 实体car 实体查询结果延迟加载(懒加载)user 实体查询结果:查询完会发现,控制台又打印了一个...
    99+
    2023-05-18
    Spring JPA联表查询 Spring JPA OneToOne
  • 【MySQL】MySQL表之联合查询(多表查询)
    📌前言:本篇博客介绍MySQL数据库的MySQL表之联合查询(多表查询),学习MySQL之前要先安装好MySQL,如果还没有安装的小伙伴可以看看博主前面的博客,里面有详细的安装教程。 那我们废话不多说,直接进入主体!...
    99+
    2023-08-16
    mysql 数据库 java
  • Spring JPA联表查询之注解属性详解
    目录前言一、targetEntity二、cascade1、不定义2、CascadeType.PERSIST3、CascadeType.REMOVE4、CascadeType.REFR...
    99+
    2023-05-18
    Spring JPA联表查询注解属性 Spring JPA
  • sqlserver多表联合查询和多表分页查询的代码讲解
    这篇文章主要为大家详细介绍了sqlserver多表联合查询和多表分页查询的方法,图文详解容易学习,配合代码阅读理解效果更佳,非常适合初学者入门,感兴趣的小伙伴们可以参考一下。多表联查:select...
    99+
    2024-04-02
  • SQL优化之多表关联查询
    慢SQL日志里看到一个三张表的关联查询,如下: 1 ...
    99+
    2024-04-02
  • 详解MySQL子查询(嵌套查询)、联结表、组合查询
    一、子查询 MySQL 4.1版本及以上支持子查询 子查询:嵌套在其他查询中的查询。 子查询的作用: 1、进行过滤: 实例1:检索订购物品TNT2的所有客户的ID = + 一般,在WHERE...
    99+
    2024-04-02
  • MySQL多表关联查询实例分析
    本篇内容介绍了“MySQL多表关联查询实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!数据库设计范式目前数据库设计有五种范式 , 一般...
    99+
    2023-06-30
  • MySQL派生表联表查询的示例分析
    这篇文章给大家分享的是有关MySQL派生表联表查询的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前情提要:公司运营的一个商城系统,忽然发现订单提现功能有问题,有大量的商户体现金额和订单金额不一致。于是产...
    99+
    2023-06-29
  • mybatis-plus查询源码详解
    目录配置详情测试类debug流程总结配置详情 pom.xml dependency> <groupId>com.baomidou</groupId&...
    99+
    2024-04-02
  • Mybatis-Plus多表关联查询的使用案例解析
    目录项目的目录结构:有以下四个包:有表结构如下: 首先配置pom.xml配置文件1.pojo包中有dept和emp两个实例类2.在Emp的mapper映射文件(.xml)中...
    99+
    2023-05-20
    Mybatis-Plus多表关联查询 Mybatis-Plus多表查询
  • SQL优化之多表关联查询-案例一
    慢SQL日志里看到一个三张表的关联查询,如下: SELECT COUNT(1)  FROM refund_order_item i, artis...
    99+
    2024-04-02
  • 解析Linux源码之epoll
    目录一、前言二、简单的epoll例子2.1、epoll_create2.2、struct eventpoll2.3、epoll_ctl(add)2.4、ep_insert2.5、tfile->f_op->...
    99+
    2022-06-03
    Linux 源码 Linux epoll
  • Python源码解析之List
    目录一、列表结构体二、创建列表三、添加元素四、移除元素五、清空六、销毁一、列表结构体 创建列表C语言底层的结构体 lists = [] list.append('name') list.append('age')...
    99+
    2022-06-02
    Python List python创建列表
  • Java源码解析之ClassLoader
    目录一、前言二、java 中的 ClassLoader三、Android 中的 ClassLoader四、双亲委派机制五、源码分析一、前言 一个完整的Java应用程序,当程序在运行时...
    99+
    2024-04-02
  • Spring源码解析之Configuration
    目录一、@Configuration1.1 未加@Configuration1.2 加上@Configuration1.3 Cglib动态代理二、源码跟踪2.1 Annotation...
    99+
    2024-04-02
  • Java源码解析之ConcurrentHashMap
    早期 ConcurrentHashMap,其实现是基于: 分离锁,也就是将内部进行分段(Segment),里面则是 HashEntry 的数组,和 HashMap 类似,哈...
    99+
    2024-04-02
  • Java源码解析之LinkedHashMap
    目录一、成员变量二、构造函数三、重要方法一、成员变量 先来看看存储元素的结构吧: static class Entry<K,V> extends HashMap.No...
    99+
    2024-04-02
  • mybatis-plus查询源码的示例分析
    这篇文章主要介绍mybatis-plus查询源码的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!配置详情pom.xmldependency>     &...
    99+
    2023-06-29
  • MySQL详细讲解多表关联查询
    目录数据库设计范式外键内连接 外连接结语数据库设计范式 目前数据库设计有五种范式 , 一般我们数据库只需要满足前三项即可 第一范式 : 确保每列保持原子性 什么是原子性 意...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作