SpringBoot Data JPA 关联表查询的方法

 更新时间:2018年07月03日 10:25:48   作者:Duebasso  
这篇文章主要介绍了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("****************")中语句使用,配合数据库的各种连接能实现复杂的操作。

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

相关文章

  • Java Float 保留小数位精度的实现

    Java Float 保留小数位精度的实现

    这篇文章主要介绍了Java Float 保留小数位精度的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java中的@builder建造者模式详细解析

    Java中的@builder建造者模式详细解析

    这篇文章主要介绍了Java中的@builder建造者模式详细解析,使用 @Builder 注解可以简化手动编写建造者模式的代码,使代码更加简洁易读,它可以自动生成链式调用的方法来设置对象的属性,并且可以在需要时进行可选属性的设置,需要的朋友可以参考下
    2024-01-01
  • java 多线程的同步几种方法

    java 多线程的同步几种方法

    这篇文章主要介绍了java 多线程的同步几种方法的相关资料,这里提供5种方法,需要的朋友可以参考下
    2017-09-09
  • Kafka中的producer拦截器与consumer拦截器详解

    Kafka中的producer拦截器与consumer拦截器详解

    这篇文章主要介绍了Kafka中的producer拦截器与consumer拦截器详解,Producer 的Interceptor使得用户在消息发送前以及Producer回调逻辑前有机会对消息做 一些定制化需求,比如修改消息等,需要的朋友可以参考下
    2023-12-12
  • 基于mybatis plus实现数据源动态添加、删除、切换,自定义数据源的示例代码

    基于mybatis plus实现数据源动态添加、删除、切换,自定义数据源的示例代码

    这篇文章主要介绍了基于mybatis plus实现数据源动态添加、删除、切换,自定义数据源,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • Java8中使用一行代码读取文件

    Java8中使用一行代码读取文件

    这篇文章主要介绍了Java8中使用一行代码读取文件,要注意,本文介绍的方法不适合读取很大的文件,因为可能存在内存空间不足的问题,需要的朋友可以参考下
    2015-03-03
  • 使用Java实现文件夹的遍历操作指南

    使用Java实现文件夹的遍历操作指南

    网上大多采用java递归的方式遍历文件夹下的文件,这里我不太喜欢递归的风格,这篇文章主要给大家介绍了关于使用Java实现文件夹的遍历操作的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • 教你如何使用idea管理docker

    教你如何使用idea管理docker

    其实idea也提供了docker的管理功能,比如查看容器列表,启动容器,停止容器等,本文来看下如何管理本地的docker daemon和远程的dockers daemon,感兴趣的朋友跟随小编一起看看吧
    2024-05-05
  • JetBrains IntelliJ IDEA 优化教超详细程

    JetBrains IntelliJ IDEA 优化教超详细程

    这篇文章主要介绍了JetBrains IntelliJ IDEA 优化教超详细程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • SpringCloud微服务续约实现源码分析详解

    SpringCloud微服务续约实现源码分析详解

    这篇文章主要介绍了SpringCloud微服务续约实现源码分析,服务续期和服务注册非常相似,服务注册在Eureka Client程序启动之后开启,并同时开启服务续期的定时任务
    2022-11-11

最新评论