单向manyToOne

manyToOne many方

@AllArgsConstructor
@NoArgsConstructor
@Entity
@Builder
@Getter
@Setter
@Table(name = "product"
)
public class Product{@Id@GeneratedValue(strategy = GenerationType.AUTO)private Integer id;@Column(name = "productCode")private String productCode;/*** 商品名*/@Column(name = "productName")private String productName;/*** 商品价格*/@Column(name = "productPrice")private BigDecimal productPrice;/*** 商品数量*/@Column(name = "productStock")private Integer productStock;@Column(name = "foreignCode")private String foreignCode;@ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name = "foreignCode",referencedColumnName = "code",insertable=false,updatable=false,foreignKey = @ForeignKey(name = "none", value =ConstraintMode.NO_CONSTRAINT))private JoinTable joinTable;
}

注:

  @Column(name = "foreignCode")private String foreignCode;

当前many方关联的one方字段,对应下方@JoinColumn 中的name = “foreignCode”

@JoinColumn(name = "foreignCode",referencedColumnName = "code",insertable=false,updatable=false,foreignKey = @ForeignKey(name = "none", value =ConstraintMode.NO_CONSTRAINT))

name:当前表格关联one方的字段
referencedColumnName:one方字段
insertable=false,updatable=false 不自动更新新增

one方

@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
@Builder
@Table(name = "join_table"
)
public class JoinTable implements Serializable {@Id@GeneratedValue(strategy = GenerationType.AUTO)private Integer id;// 所对应@Column(name = "code")private String code;@Column(name = "joinInfo")private String joinInfo;
}

注:

@Column(name = "code")
private String code;

与many方对应的字段,
many方 referencedColumnName = “code”

查询sql语句

select * from product left join join_table on product.foreignCode = join_table.code where join_table.joinInfo = ?

实现

List<Product> list = productRepository.findAll(new Specification<Product>() {@Overridepublic Predicate toPredicate(Root<Product> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {List<Predicate> list = new ArrayList<>();Join<Product, JoinTable> join = root.join("joinTable", JoinType.LEFT);list.add(criteriaBuilder.equal(join.get("joinInfo"), "123"));Predicate[] pre = new Predicate[list.size()];criteriaQuery.where(list.toArray(pre));return criteriaBuilder.and(list.toArray(pre));}});


1.

 Join<Product, JoinTable> join = root.join("joinTable", JoinType.LEFT);

“joinTable” :many方关联的实体类名

 @ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name = "foreignCode",referencedColumnName = "code",insertable=false,updatable=false,foreignKey = @ForeignKey(name = "none", value =ConstraintMode.NO_CONSTRAINT))private JoinTable joinTable;
list.add(criteriaBuilder.equal(join.get("joinInfo"), "123"));

“joinInfo”:one方需要查询字段名 sql为 where join_table.joinInfo = ?

@Column(name = "joinInfo")
private String joinInfo;

双向manyToOne oneToMany

many方

public class Product{@Id@GeneratedValue(strategy = GenerationType.AUTO)private Integer id;@Column(name = "productCode")private String productCode;/*** 商品名*/@Column(name = "productName")private String productName;/*** 商品价格*/@Column(name = "productPrice")private BigDecimal productPrice;/*** 商品数量*/@Column(name = "productStock")private Integer productStock;@Column(name = "foreignCode")private String foreignCode;//    @JsonIgnore@ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name = "foreignCode",referencedColumnName = "code",insertable=false,updatable=false,foreignKey = @ForeignKey(name = "none", value =ConstraintMode.NO_CONSTRAINT))private JoinTable joinTable;public BigDecimal getProductPrice() {return productPrice;}public Integer getId() {return id;}public Integer getProductStock() {return productStock;}public JoinTable getJoinTable() {joinTable.setProductList(null);return joinTable;}public String getForeignCode() {return foreignCode;}public String getProductCode() {return productCode;}public String getProductName() {return productName;}public void setForeignCode(String foreignCode) {this.foreignCode = foreignCode;}public void setId(Integer id) {this.id = id;}public void setJoinTable(JoinTable joinTable) {this.joinTable = joinTable;}public void setProductCode(String productCode) {this.productCode = productCode;}public void setProductName(String productName) {this.productName = productName;}public void setProductPrice(BigDecimal productPrice) {this.productPrice = productPrice;}public void setProductStock(Integer productStock) {this.productStock = productStock;}
}

one方

public class JoinTable implements Serializable {@Id@GeneratedValue(strategy = GenerationType.AUTO)private Integer id;// 所对应@Column(name = "code")private String code;@Column(name = "joinInfo")private String joinInfo;@OneToMany(fetch = FetchType.LAZY,mappedBy = "joinTable")List<Product> productList;@Overridepublic String toString() {return "";}
}


@OneToMany(fetch = FetchType.LAZY,mappedBy = "joinTable")

“joinTable” : many方对应的字段名,仅双向关联有用

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "foreignCode",referencedColumnName = "code",insertable=false,updatable=false,foreignKey = @ForeignKey(name = "none", value =ConstraintMode.NO_CONSTRAINT))
private JoinTable joinTable;

问题,双向依赖会导致堆栈溢出

解决:

  1. 注解 @JsonIgnore(fastjson情况)
    注解到不希望展示的字段

2.重写get方法
举例:

   public JoinTable getJoinTable() {joinTable.setProductList(null);return joinTable;}

3.使用dto接收

举例:
查询时,返回

 List<Product> list = productRepository.findAll();List<ProductVo> result = new ArrayList<>();for(int i=0;i<list.size();i++){ProductVo productVo = new ProductVo();BeanUtils.copyProperties(list.get(i),productVo,"joinTable");
//            productVo.setForeignCode(list.get(i).getForeignCode());
//            productVo.setProductCode(list.get(i).getProductCode());
//            productVo.setProductName(list.get(i).getProductName());
//            productVo.setProductPrice(list.get(i).getProductPrice());
//            productVo.setProductStock(list.get(i).getProductStock());result.add(productVo);}return result;

ProductVo 去除会依赖的内容

public class ProductVo {private String productCode;/*** 商品名*/private String productName;/*** 商品价格*/private BigDecimal productPrice;/*** 商品数量*/private Integer productStock;private String foreignCode;
}

jpa 多表关联查询相关推荐

  1. jpa多表关联查询_JPA【关联查询篇】

    摘要:本文主要介绍JPA的多表关联查询(一对一.一对多.双向关联.多对一.多对多)以及N+1查询的优化. 1. JPA多表关联查询 多表关联查询就是实现使用一个实体类对象操作或者查询多个表的数据. 配 ...

  2. Spring Data JPA 多表关联查询的实现

    Spring Data JPA 多表关联查询的实现 多表查询在spring data jpa中有两种实现方式,第一种是利用hibernate的级联查询来实现,第二种是创建一个结果集的接口来接收连表查询 ...

  3. jpa多表关联查询_Spring Boot 整合mybatis如何自定义 mapper 实现多表关联查询

    上一篇文章已经介绍了自定义 mapper 实现自定义的方法,其实实现了通过自定义的mapper就可以做多表关联等复杂查询.但是很多朋友还是反馈说没有实现多表关联查询,所以,今天把文章又重新修改了,增加 ...

  4. SpringBoot (四):JPA(多表关联查询)

    Spring Boot Jpa 是 Spring 基于 ORM 框架.Jpa 规范的基础上封装的一套 Jpa 应用框架,可使开发者用极简的代码即可实现对数据的访问和操作.它提供了包括增删改查等在内的常 ...

  5. JPA多表关联查询,自定义实体类接收返回的结果集

    在项目中使用jpa进行多表连接查询,基本上返回的都是多张表中的数据.那么问题来了,这关联返回的数据那么多,还是不同表当中的数据,数据库中也没有表和它对应啊,怎么处理呢?返回Object吗 1.教师类 ...

  6. Spring boot jpa 多表关联查询

    效果图: 如图,根据条件查询主表信息,并关联获取详细数据,并实现简单的排序功能,不多说,上代码: model: /** * @author xj * @date 2017/5/3 13:31 */ @ ...

  7. 【SpringBoot Data JPA】多表关联查询

    SpringBoot Data JPA 多表关联查询 前言 一.数据库架构设计 1.1 数据表结构 2.2 建立数据库表: 二.SpringBoot整合JPA多表查询 2.1 环境配置 2.2 建立数 ...

  8. 解决Springboot+JPA中多表关联查询会查询多次的问题(n+1查询问题)

    解决Springboot+JPA中多表关联查询会查询多次的问题(n+1查询问题) 参考文章: (1)解决Springboot+JPA中多表关联查询会查询多次的问题(n+1查询问题) (2)https: ...

  9. jpa 去重_spring boot jpa 表关联查询分组 group by 去重

    使用jpa操作多张表进行关联查询时,有重复数据需要分组去重 1)确定主表:将有重复数据的表格作为主表,表明关系 public class AttendanceRuleTypeItem implemen ...

最新文章

  1. [Spring mvc 深度解析(一)] 详解Servlet
  2. python工程师-史上最全Python工程师常见面试题集锦,有这一份就够了
  3. Geoff Hinton:我反对谷歌军事项目,论文评审机制正在阻碍创新
  4. 用GDB调试程序(六)
  5. SpringCloud个人笔记-02-Feign初体验
  6. skt7850鸿蒙策略,lol 英雄联盟 SKT状态回暖轻取外卡,SUP难挡Faker
  7. 字符串匹配算法之KMP
  8. 获得代理ippython_Python学习笔记六(免费获取代理IP)
  9. 解决IP地址冲突的问题
  10. Ros学习笔记(一)创建工作空间
  11. (转)JD-Quant量化交易平台设计:延迟latency
  12. Oracle建立连接的过程分析
  13. 利用poi3.8中SXSSFWorkbook实现大数据量导出excel
  14. 远程如何重装linux系统,独立服务器远程重装Linux系统
  15. 【Hive】Both left and right aliases encountered in JOIN
  16. Centos测试作死命令rm -rf /
  17. LDAP ObjectClass 详解
  18. 入门 | 走近流行强化学习算法:最优Q-Learning
  19. 线性判别准则与线性分类编程实践
  20. 2007年互联网发展趋势预测:RSS将成为主流

热门文章

  1. VMware开启虚拟机提示“内部错误”
  2. Adobe Illustrator 如何导出超高分辨率的PDF文件 为什么导出的那么慢呢?
  3. ipad分屏功能怎么用_用iPad真的可以提高学习效率么?怎么把iPad变成生产力?
  4. 网络服务之nginx详解
  5. java输出字体_Java打印字体拉伸
  6. pr显示计算机内存不足,英特尔解答:电脑扩展了内存,但还总是提示内存不足?...
  7. ExcelToDatabase:批量导入Excel文件到MySQL/Oracle/SQL Server数据库的自动化工具
  8. 面经|快手|策略运营实习生(数据分析)-【电商】|30min
  9. (图像变换)Python-opencv,(批处理笛卡尔坐标系,也就是平时咱们看到的正常图片)二维彩色图像转化为极坐标系下的图像
  10. 互联网晚报 |12/7星期三| 荣耀回应借壳上市传闻;三亚机票酒店预订暴涨3倍;12月6日起,进入首都机场航站楼可不查验核酸证明...