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+查询的字段。 千万不要写错了,写错的话运行都运行不起来的。所以写的时候要多看看是否符合规则。

如果大家想要源代码或者对本文有啥异议都可以加我QQ:208017534  欢迎打扰哦!!!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏liulun

学习WPF——WPF布局——了解布局容器

WPF布局工作内部原理 WPF渲染布局时主要执行了两个工作:测量和排列 测量阶段,容器遍历所有子元素,并询问子元素所期望的尺寸 排列阶段,容器在合适的位置...

1735
来自专栏林德熙的博客

C#同步方法转异步 创建新线程AMP 转 EAP

最简单的方法是创建一个新的线程,创建的方法是使用 Task.Run ,请看下面代码,原来有一个函数 Delay 需要把他转换为异步,就可以使用 DelayAsy...

502
来自专栏吴老师移动开发

【iOS开发】Responder Chain做事件传递

像商品详情这种有各种各样的cell,cell里面又有各种不同的按钮事件等。cell里面可能还有几层UI,如何将这种层级很多很复杂的UI页面的事件传递到Contr...

823
来自专栏木宛城主

Unity应用架构设计(3)——构建View和ViewModel的生命周期

对于一个View而言,本质上是一个MonoBehaviour。它本身就具备生命周期这个概念,比如,Awake,Start,Update,OnDestory等。...

2035
来自专栏Windows Community

New UWP Community Toolkit - Staggered panel

概述 前面 New UWP Community Toolkit 文章中,我们对 2.2.0 版本的重要更新做了简单回顾,其中简单介绍了 Staggered pa...

2966
来自专栏腾讯社交用户体验设计

带你轻松打开SVG动画的大门 - 腾讯ISUX

802
来自专栏木宛城主

Unity应用架构设计(1)—— MVVM 模式的设计和实施(Part 1)

初识 MVVM 谈起 MVVM 设计模式,可能第一映像你会想到 WPF/Sliverlight,他们提供了的数据绑定(Data Binding),命令(Comm...

2306
来自专栏C/C++基础

C#GDI绘制自定义字体

private void PaintMessageBox()         {             Graphics g = this.panel1....

753
来自专栏菩提树下的杨过

Silverlight:利用Panel实现自定义布局

虽然Silverlight提供了几种基本的布局方式,比如Canvas,Grid,StackPanel,Border...,但有时候可能仍然会觉得不够用。 这时候...

2049
来自专栏Java大联盟

SpringMVC笔记(8):表单标签库

我们为什么要使用Spring MVC表单标签库?一句话,使用它是为了简化代码的开发,提高我们的效率,其实我们使用任何一款框架或者工具都是出于这个目的,实现快速开...

592

扫码关注云+社区