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("****************")中语句使用,配合数据库的各种连接能实现复杂的操作。

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

    </div>

原文地址:https://www.jb51.net/article/143060.htm

SpringBoot Data JPA 关联表查询的方法的更多相关文章

  1. 关于Spring Data JPA 多表查询 返回自定义Vo的问题记录

    这两天开了一个新项目,使用SpringBoot+SpringData,  刚做了一个小功能,都是一张表的操作没什么问题,今天设计到了两张表联查,两张表各取了几个字段,组合成了一个vo, 当我用原生sq ...

  2. Spring data jpa 复杂动态查询方式总结

    一.Spring data jpa 简介 首先我并不推荐使用jpa作为ORM框架,毕竟对于负责查询的时候还是不太灵活,还是建议使用mybatis,自己写sql比较好.但是如果公司用这个就没办法了,可以 ...

  3. jpa 联表查询 返回自定义对象 hql语法 原生sql 语法 1.11.9版本

    -----业务场景中经常涉及到联查,jpa的hql语法提供了内连接的查询方式(不支持复杂hql,比如left join ,right join).  上代码了 1.我们要联查房屋和房屋用户中间表,通过 ...

  4. 【Spring Data 系列学习】Spring Data JPA @Query 注解查询

    [Spring Data 系列学习]Spring Data JPA @Query 注解查询 前面的章节讲述了 Spring Data Jpa 通过声明式对数据库进行操作,上手速度快简单易操作.但同时 ...

  5. 在MyBatis中查询数据、涉及多参数的数据访问操作、插入数据时获取数据自增长的id、关联表查询操作、动态SQL、关于配置MyBatis映射没有代码提示的解决方案

    1. 单元测试 在单元测试中,每个测试方法都需要执行相同的前置代码和后置代码,则可以自定义2个方法,分别在这2个方法中执行前置代码和后置代码,并为这2个方法添加@Before和@After注解,然后, ...

  6. SSH框架的多表查询(方法二)增删查改

     必须声明本文章==>http://www.cnblogs.com/zhu520/p/7773133.html  一:在前一个方法(http://www.cnblogs.com/zhu520/p ...

  7. Mybatis源码分析--关联表查询及延迟加载原理(二)

    在上一篇博客Mybatis源码分析--关联表查询及延迟加载(一)中我们简单介绍了Mybatis的延迟加载的编程,接下来我们通过分析源码来分析一下Mybatis延迟加载的实现原理. 其实简单来说Myba ...

  8. .NetCore中EFCore的使用整理(二)-关联表查询

    EF常用处理关联加载的方式有3中:延迟加载(Lazy Loading).贪婪加载 (Eager Loading)以及显示加载. 一.EF Core  1.1 1.当前的版本,还不支持延迟加载(Lazy ...

  9. SSH框架的多表查询(方法二)

     必须声明本文章==>http://www.cnblogs.com/zhu520/p/7773133.html  一:在前一个方法(http://www.cnblogs.com/zhu520/p ...

随机推荐

  1. 【转】【开源下载】基于TCP网络通信的即时聊天系统(IM系统)(c#源码)

    原文链接 强烈关注,学习!

  2. .Net Framework Client Profile 和 .Net Framework的区别[转]

    原文链接 VS2010默认是以.Net Framework Client Profile为生成环境的,如果需要更多的功能,应该调用.Net Framework.

  3. D. Leaving Auction 一题很好的思维题

    http://codeforces.com/contest/749/problem/D 现在发现做题要把样例抄下来,然后画一画,这样才容易发现新大陆.嗯,以后做题就这样. 如果排除了被删除了的人,那么 ...

  4. 给ambari集群里的kafka安装基于web的kafka管理工具Kafka-manager(图文详解)

    不多说,直接上干货! 参考博客 基于Web的Kafka管理器工具之Kafka-manager的编译部署详细安装 (支持kafka0.8.0.9和0.10以后版本)(图文详解)(默认端口或任意自定义端口 ...

  5. .NET通过字典给类赋值

    /// <summary> /// /// </summary> /// <typeparam name="T"></typeparam& ...

  6. asp.net网站接入QQ登录

    这两天在做网站第三方登录,总结一下QQ登录吧,支付宝就不用了(下载dome把ID什么的换一换就基本可以了.),本文主要说的是代码的实现方式,逻辑部分主要还是根据帮助文档来的.不懂的同学可以先看看文档. ...

  7. Django系列:(1)PyCharm下创建并运行我们的第一个Django工程

    准备工作: 假设读者已经安装好python 2x或3x,以及安装好Django,以及Pycharm. 我的配置: – Python 2.7.11 – Pycharm Professional 5.0. ...

  8. 来自锐动天地的直播ios SDK

    直播iOS SDK,可以在手机iOS端实时采集视频,同时在拍摄过程中支持多种实时滤镜效果,只要调用视频直播接口,通过3G.4G.WIFI等网络,推流发送给云端流媒体直播系统处理,并通过CDN视频加速分 ...

  9. Android学习笔记(十一) Intent

    一.Intent对象的基本概念 -Intent是Android应用程序组件之一 -Intent对象在Android系统当中表示一种意图 -Intent当中最重要的内容是action与data 二.In ...

  10. R Programming week 3-Loop functions

    Looping on the Command Line Writing for, while loops is useful when programming but not particularly ...