SpringBoot Data JPA 关联表查询的方法

SpringBoot Data JPA实现 一对多、多对一关联表查询

开发环境

  1. IDEA 2017.1
  2. Java1.8
  3. SpringBoot 2.0
  4. MySQL 5.X

功能需求

通过关联关系查询商店Store中所有的商品Shop,商店对商品一对多,商品对商店多对一,外键 store_id存在于多的一方。使用数据库的内连接语句。

表结构

tb_shop

tb_store

实体类,通过注解实现

1.商店类Store.java

package com.gaolei.Entity;
import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;

/**
 * Created by GaoLei on 2018/6/25.
 */
@Entity
@Table(name = "tb_store")
public class Store {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Integer id;//商铺号

  private String name;//商铺姓名

  private String address;//商铺地址

  private int tel ;//商铺联系

  private String info;//商铺信息

  @OneToMany(cascade = CascadeType.ALL,mappedBy = "store")
  private Set<Shop> shops = new HashSet<Shop>();
  // 省略set()和get()方法;
}

商品类Shop.java

package com.gaolei.Entity;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;

/**
 * Created by GaoLei on 2018/6/25.
 */
@Entity
@Table(name = "tb_shop")
public class Shop {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Integer id ; //商品id

  private String name;//商品名

  private int price;// 商品价格

  private int num;//商品数量

  private String info;//商品信息

  @ManyToOne
  @JoinColumn(name = "store_id")//外键
  private Store store;
  // 省略set()和get()方法;
}

StoreDao.java

CrudRepository 接口继承于 Repository 接口,并新增了简单的增、删、查等方法。其中封装好了很多的方法,这里不再概述,自行百度,这里通过自定义HQL语句完成复杂的操作。

package com.gaolei.Dao;
import com.gaolei.Entity.Store;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
 * Created by GaoLei on 2018/6/25.
 */
@Repository
public interface StoreDao extends CrudRepository<Store,Integer> {

  //此方法通过内连接查询店铺id=?中的所有商品
  @Query("select distinct s from Store s inner join s.shops where s.id = ?1")
  List<Store> findByShopList(Integer id);
}

StoreService.java

通过@Autowired注入StoreDao来实现方法

package com.gaolei.Service;
import com.gaolei.Dao.StoreDao;
import com.gaolei.Entity.Shop;
import com.gaolei.Entity.Store;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;

/**
 * Created by GaoLei on 2018/6/25.
 */
@Controller
@Transactional
public class StoreService {
  @Autowired
  private StoreDao storeDao;
  /**
   * 展示商店商品
   * */
  public List<Store> findByShopList(Integer id){
    return storeDao.findByShopList(id);
  }
}

StoreAction.java

实现具体数据操作操作

package com.gaolei.Action;
import com.gaolei.Entity.Shop;
import com.gaolei.Entity.Store;
import com.gaolei.Service.ShopService;
import com.gaolei.Service.StoreService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
/**
 * Created by GaoLei on 2018/6/26.
 */
@Controller
@RequestMapping("/store")
public class StoreAction {

  @Autowired
  private StoreService storeService;

 /**
   * Store_shop_menu展示店铺商品
   * */
  @RequestMapping("showShop")
  public String showShop(HttpServletResponse response ,HttpServletRequest request,Model model){
    String id = request.getParameter("store_id");
    //通过HQL语句拿到id=?的商铺,并拿到该店铺下所有的商品
    List<Store> list = storeService.findByShopList(Integer.valueOf(id));
    //返回的为一个Store集合,Store类和Shop类为一对多,Store下的shops为List<Shop>。
    List<Shop> shopList = new ArrayList<Shop>();
//循环遍历拿到每一个shop,添加到一个新的List<Shop>中,用于将数据在前台展示。
    for (Store store:list){
        System.out.println(store.getName());
      for (Shop shop: store.getShops()) {
        System.out.println(shop.getName());
        shopList.add(shop);
      }
    }
    model.addAttribute("list",shopList);
    return "admin/showShop";
  }
}

前台页面跳转

查看的店铺

店铺商品

省略前端代码,主要的是@Query("****************")中语句使用,配合数据库的各种连接能实现复杂的操作。

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

时间: 2018-07-02

SpringBoot集成Spring Data JPA及读写分离

相关代码: github OSCchina JPA是什么 JPA(Java Persistence API)是Sun官方提出的Java持久化规范,它为Java开发人员提供了一种对象/关联映射工具 来管理Java应用中的关系数据.它包括以下几方面的内容: 1.ORM映射 支持xml和注解方式建立实体与表之间的映射. 2.Java持久化API 定义了一些常用的CRUD接口,我们只需直接调用,而不需要考虑底层JDBC和SQL的细节. 3.JPQL查询语言 这是持久化操作中很重要的一个方面,通过面向对象

SpringBoot使用Spring-Data-Jpa实现CRUD操作

本文演示了SpringBoot下,实用Spring-Data-Jpa来实现CRUD操作,视图层采用Freemarker 这里我们先把application.properties修改成application.yml 主流格式 内容也改成yml规范格式: server: port: 8888 context-path: / helloWorld: spring Boot\u4F60\u597D msyql: jdbcName: com.mysql.jdbc.Driver dbUrl: jdbc:my

详解基于Spring Boot与Spring Data JPA的多数据源配置

由于项目需要,最近研究了一下基于spring Boot与Spring Data JPA的多数据源配置问题.以下是传统的单数据源配置代码.这里使用的是Spring的Annotation在代码内部直接配置的方式,没有使用任何XML文件. @Configuration @EnableJpaRepositories(basePackages = "org.lyndon.repository") @EnableTransactionManagement @PropertySource("

Spring Boot整合Spring Data JPA过程解析

Spring Boot整合Spring Data JPA 1)加入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> &l

Spring Boot中使用Spring-data-jpa实现数据库增删查改

在实际开发过程中,对数据库的操作无非就"增删改查".就最为普遍的单表操作而言,除了表和字段不同外,语句都是类似的,开发人员需要写大量类似而枯燥的语句来完成业务逻辑. 为了解决这些大量枯燥的数据操作语句,我们第一个想到的是使用ORM框架,比如:Hibernate.通过整合Hibernate之后,我们以操作Java实体的方式最终将数据改变映射到数据库表中. 为了解决抽象各个Java实体基本的"增删改查"操作,我们通常会以泛型的方式封装一个模板Dao来进行抽象简化,但是这

Spring Boot整合Spring Data Jpa代码实例

一.Spring Data Jpa的简介 spring data:其实就是spring 提供的一个操作数据的框架.而spring data JPA 只是spring data 框架下的一个基于JPA标准操作数据的模块. spring data jpa :基于JPA的标准对数据进行操作.简化操作持久层的代码,只需要编写接口就可以,不需要写sql语句,甚至可以不用自己手动创建数据库表. 二.添加依赖 <!--添加springdatajpa的依赖--> <dependency> <

在Spring Boot中使用Spring-data-jpa实现分页查询

在我们平时的工作中,查询列表在我们的系统中基本随处可见,那么我们如何使用jpa进行多条件查询以及查询列表分页呢?下面我将介绍两种多条件查询方式. 1.引入起步依赖   <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency&

springboot使用spring-data-jpa操作MySQL数据库

我们在上一篇搭建了一个简单的springboot应用,这一篇将介绍使用spring-data-jpa操作数据库. 新建一个MySQL数据库,这里数据库名为springboot,建立user_info数据表,作为我们示例操作的表对象. user_info信息如下: DROP TABLE IF EXISTS `user_info`; CREATE TABLE `user_info` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(

详解spring开发_JDBC操作MySQL数据库

本文介绍spring开发_JDBC操作MySQL数据库,具体如下: 项目结构: 数据库表: /spring_1100_spring+jdbc/src/com/b510/bean/Person.java package com.b510.bean; /** * 普通的javaBean类Person * * @author Hongten * */ public class Person { /** * id号 */ private int id; /** * 姓名 */ private Strin

使用Spring Data JPA的坑点记录总结

前言 Spring-data-jpa的基本介绍:JPA诞生的缘由是为了整合第三方ORM框架,建立一种标准的方式,百度百科说是JDK为了实现ORM的天下归一,目前也是在按照这个方向发展,但是还没能完全实现.在ORM框架中,Hibernate是一支很大的部队,使用很广泛,也很方便,能力也很强,同时Hibernate也是和JPA整合的比较良好,我们可以认为JPA是标准,事实上也是,JPA几乎都是接口,实现都是Hibernate在做,宏观上面看,在JPA的统一之下Hibernate很良好的运行. 最近在

Spring Security+Spring Data Jpa如何进行安全管理

为了操作简单,我这里引入 Spring Data Jpa 来帮助我们完成数据库操作 1.创建工程 首先我们创建一个新的 Spring Boot 工程,添加如下依赖: 注意,除了 Spring Security 依赖之外,我们还需要数据依赖和 Spring Data Jpa 依赖. 工程创建完成后,我们再在数据库中创建一个空的库,就叫做 withjpa,里边什么都不用做,这样我们的准备工作就算完成了. 2.准备模型 接下来我们创建两个实体类,分别表示用户角色了用户类: 用户角色: @Entity(

Spring Data JPA例子代码[基于Spring Boot、Mysql]

关于Spring Data Spring社区的一个顶级工程,主要用于简化数据(关系型&非关系型)访问,如果我们使用Spring Data来开发程序的话,那么可以省去很多低级别的数据访问操作,如编写数据查询语句.DAO类等,我们仅需要编写一些抽象接口并定义相关操作即可,Spring会在运行期间的时候创建代理实例来实现我们接口中定义的操作. 关于Spring Data子项目 Spring Data拥有很多子项目,除了Spring Data Jpa外,还有如下子项目. Spring Data Comm

Spring Data Jpa Mysql使用utf8mb4编码的示例代码

1 问题:数据库字符集和排序规则不一致 最近需要向一个已有的数据库进行扩充(已有数据库是由PHP建的,后来由Java进行扩展),但是出现了新表和旧表无法建立外键的问题,后来发现是因为编码问题,服务器数据库和我本地数据库的字符集和排序规则不对应,服务器数据库使用的是utf8mb4,utf8mb4_unicode_ci而我本地使用的是utf8,utf8_general_ci. 2 解决方法 2.1 将本地数据库改成utf8mb4,utf8mb4_unicode_ci 该方法参考: 更改MySQL数据

Spring Boot中使用jdbctemplate 操作MYSQL数据库实例

最近在学习使用Spring Boot连接数据库,今天学习了使用jdbctemplate 操作MYSQL数据库,下面就留个笔记 不废话,先来代码 pom文件: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org

Spring Data Jpa实现分页和排序代码实例

之前我们学习了如何使用Jpa访问关系型数据库.通过Jpa大大简化了我们对数据库的开发工作.但是,之前的例子中我们只提到了最简单的CRUD(增删改查)操作.实际上,Spring Data Jpa对于分页以及排序的查询也有着完美的支持,接下来,我们来学习如何通过Pageable来对数据库进行分页查询. 添加maven依赖 首先我们需要引入Jpa,数据库直接使用hsqldb内存数据库就可以了: <project xmlns="http://maven.apache.org/POM/4.0.0&q