今天给大家介绍一下如何利用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+查询的字段。
千万不要写错了,写错的话运行都运行不起来的。所以写的时候要多看看是否符合规则。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍Yii2.0表关联查询实例分析,包括了Yii2.0表关联查询实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Yii2.0表关联查询的方法。分享给大家供大家参考,具体如下: 你可以使用 ActiveRecord 来进行关联查询(比如,从A表读取数据时把关联的B表数据也一起读出来), 在Active Record中,获取关联数据可以像访问主表ActiveRecord对象的
本文向大家介绍ThinkPHP中关联查询实例,包括了ThinkPHP中关联查询实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了ThinkPHP中关联查询的用法。分享给大家供大家参考。具体分析如下: 在THINKPHP中关联查询(多表查询)可以使用 table() 方法或和join方法,如下示例所示: 1、table() 2、join() 3、原生查询 4、多表查询 或: 希望本文所述对
简介 Cabal-DB 的关联数据查询主要用了两个方法:->has('table') 和->belongs('table'), 因为其实数据库关联关系只有两种,一种是拥有(has)另一种是属于(belongs),如: 用户拥有更多个文章 文章拥有多个标签 文章属于一个用户 文章标签关联记录属于一个标签和一篇文章 语法 拥有关系查询语法: $row->has($name, $foreignKeyOr
本文向大家介绍MongoDB多表关联查询操作实例详解,包括了MongoDB多表关联查询操作实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了MongoDB多表关联查询操作。分享给大家供大家参考,具体如下: Mongoose的多表关联查询 首先,我们回忆一下,MySQL多表关联查询的语句: student表: calss表: 通过student的classId关联进行查询学生名称,班级
级联关系是一个数据库实体的概念,有 3 种级联关系,分别是一对一级联、一对多级联以及多对多级联。例如,一个角色可以分配给多个用户,也可以只分配给一个用户。大部分场景下,我们都需要获取角色信息和用户信息,所以会经常遇见以下 SQL。 在级联中存在 3 种对应关系。 一对多的关系,如角色和用户的关系。通俗的理解就是,一家软件公司会存在许多软件工程师,公司和软件工程师就是一对多的关系。 一对一的关系。每
本文向大家介绍Django自关联实现多级联动查询实例,包括了Django自关联实现多级联动查询实例的使用技巧和注意事项,需要的朋友参考一下 1 问题引出 我们在开发网站的时候可能会遇到这种情况,多个字段之间有一定的关联性,比如省市县,选择省,之后下一个选择框的值则为该省的市集合,选择市之后下一个选择框的值为该市的县集合。 一种实现方式是,建立三个模型表,用外键一对多方式,显然这样是不太合理的。Dj
接口说明 为了让用户更清晰的比对场景中的数据,如历史数据对比、规划前后的数据对比等,Wish3DEarth团队新增了查询关联场景的接口,开发者可以通过该接口,来获取主屏与副屏之间的关联性。 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 POST /api/contrasts/1.0.0/get 是否需要登录 否 请求字段说明 参数 类型 请
本文向大家介绍Mybatis自关联查询一对多查询的实现示例,包括了Mybatis自关联查询一对多查询的实现示例的使用技巧和注意事项,需要的朋友参考一下 注:代码已托管在GitHub上,地址是:https://github.com/Damaer/Mybatis-Learning ,项目是mybatis-13-oneself-one2many,需要自取,需要配置maven环境以及mysql环境(sql