SpringBoot JPA 表关联查询实例

今天给大家介绍一下如何利用JPA实现表关联查询。

今天给大家举一个一对多的关联查询,并且是使用JPA原生的findBy语句实现的。

例子中总共有两个实体类,一个是Floor(商品楼层类),另一个是FloorContent(商品楼层内容表)。下面看两张表的源代码:

Floor类:

package cms.model;
import cms.model.base.BaseDomain;
import org.hibernate.annotations.GenericGenerator; 

import javax.persistence.*;
import java.io.Serializable;
import java.util.List;
/**
 * Created by Roney on 2016/10/10.
 * 楼层管理
 *
 */
@Entity
@Table(indexes = {@Index(name = "idx_floor_user",columnList = "user_id")})
public class Floor extends BaseDomain implements Serializable { 

  @Id
  @GenericGenerator(name = "PKUUID", strategy = "uuid2")
  @GeneratedValue(generator = "PKUUID")
  @Column(length = 36)
  protected String id; 

  /**
   * 发布用户ID
   */
  @Column(length = 36,name = "user_id")
  private String userId; 

  /**
   * 楼层名称
   */
  private String name; 

  /**
   * 楼层的模板路径
   */
  private String templateUrl; 

  /**
   * 类型
   * 1.管理端
   * 2.供应商
   */
  private Integer type; 

  /**
   * 排序
   */
  @Column(name = "show_index", nullable = false)
  private Integer showIndex; 

  /**
   * 是否禁用
   * */ 

  @Column(nullable = false)
  private Boolean isDisable=false; 

  @OneToMany(fetch = FetchType.LAZY,mappedBy = "floor")
  private List<FloorContent> floorContents; 

  public List<FloorContent> getFloorContents() {
    return floorContents;
  } 

  public void setFloorContents(List<FloorContent> floorContents) {
    this.floorContents = floorContents;
  } 

  public String getId() {
    return id;
  } 

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

  public String getUserId() {
    return userId;
  } 

  public void setUserId(String userId) {
    this.userId = userId;
  } 

  public String getName() {
    return name;
  } 

  public void setName(String name) {
    this.name = name;
  } 

  public String getTemplateUrl() {
    return templateUrl;
  } 

  public void setTemplateUrl(String templateUrl) {
    this.templateUrl = templateUrl;
  } 

  public Integer getShowIndex() {
    return showIndex;
  } 

  public void setShowIndex(Integer showIndex) {
    this.showIndex = showIndex;
  } 

  public Boolean getDisable() {
    return isDisable;
  } 

  public void setDisable(Boolean disable) {
    isDisable = disable;
  } 

  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false; 

    Floor floor = (Floor) o; 

    return id != null ? id.equals(floor.id) : floor.id == null; 

  } 

  @Override
  public int hashCode() {
    return id != null ? id.hashCode() : 0;
  }
}

FloorContent类:

package cms.model; 

import cms.model.base.BaseDomain;
import org.hibernate.annotations.GenericGenerator; 

import javax.persistence.*;
import java.io.Serializable; 

/**
 * Created by Roney on 2016/10/10.
 * 楼层的内容
 */ 

@Entity
@Table(indexes = {@Index(name = "idx_floor_content_user", columnList = "user_id")})
public class FloorContent extends BaseDomain implements Serializable { 

  @Id
  @GenericGenerator(name = "PKUUID", strategy = "uuid2")
  @GeneratedValue(generator = "PKUUID")
  @Column(length = 36)
  protected String id; 

  /**
   * 发布用户ID
   */
  @Column(length = 36, name = "user_id")
  private String userId; 

  /**
   * 內容名稱
   */
  private String name; 

  /**
   *
   * 內容圖片
   */
  @Column(length = 256)
  private String contentImageUrl; 

  /**
   * 類型
   * 1.超鏈接
   * 2.圖片檢索
   */
  private Integer type; 

  /**
   * 超鏈接url
   */
  private String linkUrl; 

  /**
   * 圖片檢索內容
   */
  private String picSearchContent; 

  /**
   * 排序
   */
  @Column(name = "show_index", nullable = false)
  private Integer showIndex; 

  /**
   * 是否禁用
   */ 

  @Column(nullable = false)
  private Boolean isDisable = false; 

  @ManyToOne
  @JoinColumn(name = "floor_id",foreignKey = @ForeignKey(name = "fk_floor_fc"))
  private Floor floor; 

  public Floor getFloor() {
    return floor;
  } 

  public void setFloor(Floor floor) {
    this.floor = floor;
  } 

  public String getId() {
    return id;
  } 

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

  public String getUserId() {
    return userId;
  } 

  public void setUserId(String userId) {
    this.userId = userId;
  } 

  public String getName() {
    return name;
  } 

  public void setName(String name) {
    this.name = name;
  } 

  public String getContentImageUrl() {
    return contentImageUrl;
  } 

  public void setContentImageUrl(String contentImageUrl) {
    this.contentImageUrl = contentImageUrl;
  } 

  public Integer getType() {
    return type;
  } 

  public void setType(Integer type) {
    this.type = type;
  } 

  public String getLinkUrl() {
    return linkUrl;
  } 

  public void setLinkUrl(String linkUrl) {
    this.linkUrl = linkUrl;
  } 

  public String getPicSearchContent() {
    return picSearchContent;
  } 

  public void setPicSearchContent(String picSearchContent) {
    this.picSearchContent = picSearchContent;
  } 

  public Integer getShowIndex() {
    return showIndex;
  } 

  public void setShowIndex(Integer showIndex) {
    this.showIndex = showIndex;
  } 

  public Boolean getDisable() {
    return isDisable;
  } 

  public void setDisable(Boolean disable) {
    isDisable = disable;
  } 

  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false; 

    FloorContent that = (FloorContent) o; 

    return id != null ? id.equals(that.id) : that.id == null; 

  } 

  @Override
  public int hashCode() {
    return id != null ? id.hashCode() : 0;
  }
}

实体类已经出来了,现在具体说说怎么利用JPA中findBy来实现关联查询:

package cms.model.repository;
import cms.model.Floor;
import cms.model.FloorContent;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
/**
 * Created by Roney on 2016/10/10.
 * Created by Roney on 2016/10/10.
 * 楼层内容管理dao类
 */
public interface FloorContentRepos extends JpaRepository<FloorContent,String>{
  public Page<FloorContent> findByFloor_IdAndIsDeleteOrderByShowIndexAsc(String floorId,boolean b, Pageable pageable);
}

从例子中就可以看出JPA关联查询主要在“_”这个符号的使用,下面来给大家具体的介绍一下这个符号到底代表什么含义。

首先findBy是必须写的,表示使用JPA规则进行查询。

如果查询的是本张表中的内容,例如查询本张表中的name字段就可以这么写:findByName()。

如果查询的是楼层中的name字段就可以这么写:findByFloor_Name()。

如果是既要查询本张表中的name字段,也要查询楼层中的name字段,就可以这么写:findByFloor_NameAndName()。

从上面的案例就可以看出可以在findBy后面添加要关联的实体类,然后在实体类后面写上“_”,"_"符号后面是添加关联表的字段而不是本身表的字段,这点要记住。如何还想关联更多的表可以在后面添加:And+表名字+“_”+表中要查询的字段。或者只是想关联本身的查询字段可以在后面添加:And+查询的字段。

千万不要写错了,写错的话运行都运行不起来的。所以写的时候要多看看是否符合规则。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Spring Boot中防止递归查询的两种方式

    本文主要给大家介绍了关于Spring Boot防止递归查询的相关内容,这只是一个小提醒,这里有两种方式,很简单,下面来看看详细的介绍: 1.在application.properties中配置 #懒加载配置 spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true 2.在entity中添加注解 在关联对象上添加@JsonBackReference 在类上添加@JsonIgnoreProperties("roles")

  • AJAX +SpringMVC 实现bootstrap模态框的分页查询功能

    一 .效果图 二.JS function getManagerList(dealerId,page2){ macAddress = document.getElementById("activeXDemo").getMac(); $.get("${ctxPath}/common/dealer/manager?"+Math.random(), { page2: page2, pageSize2: 9, dealerId: dealerId, macAddress:ma

  • Spring Boot(五)之跨域、自定义查询及分页

    跨域 前面我们初步做出了一个可以实现受保护的 REST API,但是我们没有涉及一个前端领域很重要的问题,那就是跨域请求( cross-origin HTTP request ).先来回顾一些背景知识: 跨域请求 定义:当我们从本身站点请求不同域名或端口的服务所提供的资源时,就会发起跨域请求. 例如最常见的我们很多的 css 样式文件是会链接到某个公共 CDN 服务器上,而不是在本身的服务器上,这其实就是典型的一个跨域请求.但浏览器由于安全原因限制了在脚本( script )中发起的跨域 HTT

  • SpringBoot多表联查(测试可用)

    今天在写的时候,遇到了多表查询的问题,网上有好多可以说是好烦,对于习惯了写sql的我来说,简直... 好啦,直接分享代码吧. public interface FieldValueDao extends JpaRepository<FieldValue,Integer> { @Query("select fv from FieldValue fv where field_id IN (select id from Field where table_id=:tableId) ORDE

  • 基于SpringMVC+Bootstrap+DataTables实现表格服务端分页、模糊查询

    前言 基于SpringMVC+Bootstrap+DataTables实现数据表格服务端分页.模糊查询(非DataTables Search),页面异步刷新. 说明:sp:message标签是使用了SpringMVC国际化 效果 DataTable表格 关键字查询 自定义关键字查询,非DataTable Search 代码 HTML代码 查询条件代码 <!-- 查询.添加.批量删除.导出.刷新 --> <div class="row-fluid"> <di

  • SpringBoot JPA 表关联查询实例

    今天给大家介绍一下如何利用JPA实现表关联查询. 今天给大家举一个一对多的关联查询,并且是使用JPA原生的findBy语句实现的. 例子中总共有两个实体类,一个是Floor(商品楼层类),另一个是FloorContent(商品楼层内容表).下面看两张表的源代码: Floor类: package cms.model; import cms.model.base.BaseDomain; import org.hibernate.annotations.GenericGenerator; import

  • Yii2.0表关联查询实例分析

    本文实例讲述了Yii2.0表关联查询的方法.分享给大家供大家参考,具体如下: 你可以使用 ActiveRecord 来进行关联查询(比如,从A表读取数据时把关联的B表数据也一起读出来), 在Active Record中,获取关联数据可以像访问主表ActiveRecord对象的属性(property)一样简单. 比如,通过合适的关系声明,你可以使用 $customer->orders 来获取一个 Order 对象数组,代表该客户下的订单. 要声明一个关系(relation),定义一个getter方

  • thinkphp中的多表关联查询的实例详解

    thinkphp中的多表关联查询的实例详解 在进行后端管理系统的编程的时候一般会使用框架来进行页面的快速搭建,我最近使用比较多的就是thinkphp框架,thinkphp框架的应用其实就是把前端和后端进行分割管理,前端用户登录查询系统放在thinkphp中的home文件夹中进行管理,后端管理系统放在thinkphp中的admin文件夹中进行管理.对了,在使用thinkphp框架的时候是是要用到mvc架构的,mvc架构就是model(数据模型).view(视图).controller(控制器)的结

  • MongoDB多表关联查询操作实例详解

    本文实例讲述了MongoDB多表关联查询操作.分享给大家供大家参考,具体如下: Mongoose的多表关联查询 首先,我们回忆一下,MySQL多表关联查询的语句: student表: calss表: 通过student的classId关联进行查询学生名称,班级的数据: SELECT student.name,student.age,class.name FROM student,class WHERE student.classId = class.id Mongoose多表联合查询(还是以众所

  • JPA如何使用nativequery多表关联查询返回自定义实体类

    目录 JPA nativequery多表关联查询返回自定义实体类 JPA多表关联的实现方式 优缺点对比 使用sql并返回自定义实体类 JPA多表关联动态查询(自定义sql语句) 实体类 注解解释 测试类 打印结果 TestVo实体接收类 JPA nativequery多表关联查询返回自定义实体类 JPA官方推荐的多表关联查询使用不便,接触的有些项目可能会使用JPA 做简单查询,Mybaits做复杂查询.所以想要寻找一种好用的解决方案. JPA多表关联的实现方式 1.使用Specification

  • Yii2.0框架模型多表关联查询示例

    本文实例讲述了Yii2.0框架模型多表关联查询.分享给大家供大家参考,具体如下: 联表查询--hasMany: use app\models\User; $right = Right::findOne(2); //$user = User::find()->where(['right_id' => $right->attributes['id']])->all(); $user = $right->hasMany(User::className(),['right_id' =

  • 使用AOP+反射实现自定义Mybatis多表关联查询

    目录 一.需求 二.核心代码 MapTo DoMap IDualMapper DualMapper DoMapAspect 三.使用方法 SysUser SysRole SysPermission SysUserService DoMapTests 测试数据 测试结果 一.需求 目前使用的ORM框架是Mybatis Plus,是Mybatis的增强框架,基础的CRUD的方法都集成了,开发起来很是方便.但是项目中总是需要多表关联查询. Mybatis的多表关联有两种 一.在Mapper中使用@Re

  • Mybatis多表关联查询的实现(DEMO)

    概要 本节要实现的是多表关联查询的简单demo.场景是根据id查询某商品分类信息,并展示该分类下的商品列表. 一.Mysql测试数据 新建表Category(商品分类)和Product(商品),并插入几条测试数据. create table Category ( Id int not null auto_increment, Name varchar(80) null, constraint pk_category primary key (Id) ); INSERT INTO category

  • Yii2中多表关联查询hasOne hasMany的方法

    表positionContent id position_id content_title content_id is_recommend list_sort update_time create_time 10 14 大成成长 160910 1 1 2017-02-09 11:51:56 2017-02-09 11:51:56 11 15 创新成长 160910 1 1 2017-02-09 11:52:08 2017-02-09 11:52:08 position表 id name titl

  • Yii2中使用join、joinwith多表关联查询

    表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_name customer_id book_id) 图书表 (id book_name author_id) 作者表 (id author_name) 模型定义 下面是这4个个模型的定义,只写出其中的关联 Customer class Customer extends \yii\db\ActiveRecord { // 这是获取客户的订单,由上面我们

随机推荐