美文网首页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琉璃球:@黄老斜 这个是自己在自学知识点的时候写的,刚步入公司实习,许多东西公司都有自己的一套完整框架。
      • 沙师弟123:是@Jsonigore,但是我想返回它的值,只不过不要死循环
      • 沙师弟123:你是怎么解决双向映射死循环的?你试试通过rest方式 return一个shop对象,会报错,因为shop对象关联查询了store对象,store对象又会关联查询shop集合……无休止
        被时间推开:@沙师弟123 有个注解可以解决,叫ignore啥的,我之前遇到过

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

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