美文网首页Spring-Bootjava学习SpringHome
SpringBoot Data JPA 关联表查询

SpringBoot Data JPA 关联表查询

作者: 小叮当de琉璃球 | 来源:发表于2018-06-30 11:21 被阅读17次
SpringBoot Data JPA实现 一对多、多对一关联表查询

开发环境

IDEA 2017.1
Java1.8
SpringBoot 2.0
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()方法;
}
  1. 商品类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()方法;
}
  1. 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);
}
  1. 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);
    }
}
  1. 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";
    }

}
  1. 前台页面跳转


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

相关文章

网友评论

  • 黄老斜:写个毕业设计还行,公司项目没人这么用
    小叮当de琉璃球:@黄老斜 这个是自己在自学知识点的时候写的,刚步入公司实习,许多东西公司都有自己的一套完整框架。
  • bcf28c6d25ed:是@Jsonigore,但是我想返回它的值,只不过不要死循环
  • bcf28c6d25ed:你是怎么解决双向映射死循环的?你试试通过rest方式 return一个shop对象,会报错,因为shop对象关联查询了store对象,store对象又会关联查询shop集合……无休止
    被时间推开:@沙师弟123 有个注解可以解决,叫ignore啥的,我之前遇到过

本文标题:SpringBoot Data JPA 关联表查询

本文链接:https://www.haomeiwen.com/subject/xwhtuftx.html