• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Spring Data JPA Specification多表關聯查詢

    需求:有一個流量計的設備,流量計有一個所屬罐區id,想要通過所屬罐區查到所關聯的這個罐區的編碼以及名稱。

    1.流量計實體類:

    主要是給流量計實體添加了以下屬性,通過tank_area_id關聯:
    在這里插入圖片描述

    package com.supcon.mare.tankinfo.entity;
    
    import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
    import lombok.Data;
    import org.springframework.data.annotation.CreatedDate;
    import org.springframework.data.annotation.LastModifiedDate;
    import javax.persistence.*;
    import java.io.Serializable;
    import java.util.Date;
    
    /**
     * @author: zhaoxu
     * @date: 2020/9/28 11:21
     * @description: 流量計對象
     */
    @Entity
    @Table(name = "flowmeter_info")
    @JsonIgnoreProperties(ignoreUnknown = true)
    @Data
    public class FlowmeterInfoEntity implements Serializable {
        private static final long serialVersionUID = 1335421266779672060L;
        /**
         * id
         */
        @Id
        @Column(name = "id", nullable = false)
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        /**
         * 流量計編號
         */
        @Column(name = "flowmeter_code", nullable = false, length = 100)
        private String flowmeterCode;
    
        /**
         * 流量計名稱
         */
        @Column(name = "flowmeter_name", nullable = false, length = 100)
        private String flowmeterName;
    
        /**
         * 該設備歸屬于某個罐區內設備
         */
        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "tank_area_id", referencedColumnName = "id",
                foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT))
        private TankAreaEntity tankArea;
    
        /**
         * 設備當前狀態:正常、維護、檢修、停用
         */
        @Column(name = "device_status", nullable = false, length = 100)
        private String deviceStatus;
    
        /**
         * 流量計類型:質量流量計、體積流量計等...
         */
        @Column(name = "flowmeter_type", nullable = false, length = 100)
        private String flowmeterType;
    
        /**
         * 設備描述
         */
        @Column(name = "remark", length = 255)
        private String remark;
    
        /**
         * 啟停位號
         */
        @Column(name = "switch_tag", length = 100)
        private String switchTag;
    
        /**
         * 流速,位號數據
         */
        @Column(name = "current_speed", length = 100)
        private String currentSpeed;
    
        /**
         * 流速量程上限
         */
        @Column(name = "current_speed_max", length = 100)
        private String currentSpeedMax;
    
        /**
         * 流速量程下限
         */
        @Column(name = "current_speed_min", length = 100)
        private String currentSpeedMin;
    
        /**
         * 累計流量,位號數據
         */
        @Column(name = "cumulative_flow_total", length = 100)
        private String cumulativeFlowTotal;
    
        /**
         * 累計流量量程上限
         */
        @Column(name = "cumulative_flow_max", length = 100)
        private String cumulativeFlowMax;
    
        /**
         * 累計流量量程下限
         */
        @Column(name = "cumulative_flow_min", length = 100)
        private String cumulativeFlowMin;
    
        /**
         * 是否被占用,是/否,默認否
         */
        @Column(name = "occupied", nullable = false)
        private int occupied;
    
        @CreatedDate
        @Column(name = "gmt_create", updatable = false)
        @Temporal(TemporalType.TIMESTAMP)
        private Date gmtCreate;
    
        @LastModifiedDate
        @Column(name = "gmt_modified", insertable = false)
        @Temporal(TemporalType.TIMESTAMP)
        private Date gmtModified;
    
        @Column(name = "valid", columnDefinition = "integer")
        private Integer valid;
    
    }
    

    2.Specification使用:

    主要是通過Join關聯另一個表,進行查詢:
    在這里插入圖片描述

     Specification<FlowmeterInfoEntity> specification = (root, query, cb) -> {
                List<Predicate> predicates = new ArrayList<Predicate>();
    
                //關聯查詢
                Join<BlindPlateEntity, TankAreaEntity> join =  root.join("tankArea", JoinType.INNER);
    
                //未刪除的數據
                predicates.add(cb.equal(root.get(Constants.VALID), 1));
    
                //流量計名稱
                if (tableMap.get(Constants.FLOWMETER_NAME) != null) {
                    predicates.add(cb.like(root.get(Constants.FLOWMETER_NAME), "%" + tableMap.get(Constants.FLOWMETER_NAME) + "%"));
                }
    
                //流量計編號
                if (tableMap.get(Constants.FLOWMETER_CODE) != null) {
                    predicates.add(cb.like(root.get(Constants.FLOWMETER_CODE), "%" + tableMap.get(Constants.FLOWMETER_CODE) + "%"));
                }
    
                //罐區編碼
                if (tableMap.get(Constants.TANK_AREA_CODE) != null) {
                    predicates.add(cb.like(join.get(Constants.TANK_AREA_CODE), "%" + tableMap.get(Constants.TANK_AREA_CODE)+ "%"));
                }
    
                //流量計類型
                if (tableMap.get(Constants.FLOWMETER_TYPE) != null) {
                    predicates.add(cb.equal(root.get(Constants.FLOWMETER_TYPE), tableMap.get(Constants.FLOWMETER_TYPE)));
                }
    
                //設備狀態
                if (tableMap.get(Constants.DEVICE_STATUS) != null) {
                    predicates.add(cb.equal(root.get(Constants.DEVICE_STATUS), tableMap.get(Constants.DEVICE_STATUS)));
                }
    
                //是否占用
                if (tableMap.get(Constants.OCCUPIED) != null) {
                    predicates.add(cb.equal(root.get(Constants.OCCUPIED), tableMap.get(Constants.OCCUPIED)));
                }
                Predicate[] pre = new Predicate[predicates.size()];
                Predicate preAnd = cb.and(predicates.toArray(pre));
                return query.where(preAnd).getRestriction();
            };
    
    版權聲明:本文為qq_39898191原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qq_39898191/article/details/109246385

    智能推薦

    【Spring Data 系列學習】Spring Data JPA 基礎查詢

    【Spring Data 系列學習】Spring Data JPA 基礎查詢 前面的章節簡單講解了 了解 Spring Data JPA 、 Jpa 和 Hibernate ,本章節開始通過案例上手 Spring boot Jpa 。 spring data Spring Data 庫的核心接口是 Repository。首先需要定義實體類的接口,接口必須繼承 repository 并且輸入實體類型...

    Spring Data JPA之動態查詢

    在日常工作中,Spring Data JPA的使用給我們帶來了極大的方便,但是實際業務中很多場景需要支持動態查詢。比如前端查詢功能提供了很多查詢條件,用戶可以根據一部分條件進行查詢,那么后端就需要支持可配置的查詢服務。在使用mybatis等時,可以用動態查詢的方式輕松搞定,但是對于初次使用Spring Data JPA的小白來說,著實有些困難。本人也是在實際工作中參考資料,一步步摸索,掌握了一定的...

    Spring Data JPA復雜動態查詢

    Spring Data JPA其諸多優點給我們的工作帶來了很多便利,但對于接觸不久的同學來說,有些情況讓我們頭疼。一些復雜的查詢,比如涉及到聚合函數、動態多條件等,著實有些棘手。在不夠了解的情況下,覺得Spring Data JPA在這方面不太人性化,有時候我們干脆使用原生sql粗暴的來解決這類查詢問題。但這與Spring Data JPA的初衷是相悖的,在不斷的學習中,慢慢發現Spring Da...

    Spring-Data-Jpa條件查詢

    Spring-Data-Jpa條件查詢 按照SpringData的規則,可以通過定義在Repository接口下的方法名稱來執行查詢等操作,查詢的方法名稱必須以find、get、read、開頭,同時,涉及條件查詢時,SpringDataJpa支持將條件屬性定義在數據訪問層接口下的方法名稱中,條件屬性通過條件關鍵字鏈接。需要注意的是:條件屬性的首字母必須大寫,下面來看一個案例吧。 1、創建一個spr...

    spring data jpa實現分頁查詢功能

    spring data jpa實現分頁查詢功能 HTML代碼部分: Action類: Service代碼: dao層:...

    猜你喜歡

    數組刪除其中某個對象的方法

    數組刪除其中的對象或元素,在前端是比較常見的需求。 我現在比較常用的方法如下: 這種方法只適合刪除具有唯一標識的對象。 有沒有想要脫單的小伙伴,加入我們的脫單星球,認識更多優秀的小哥哥小姐姐 特此聲明,星球是免費的,但是創建星球的時候說是必須輸入金額,所以只能先私聊,我再加你免費加入!...

    圖床搭建以及圖床工具的使用

    為什么要用圖床和圖床工具? 比較下面三種md中的圖片url地址(均免費),你會使用哪一種? 選1?由于是本地路徑,文檔分享后給其他人打開后很可能顯示圖片加載失敗。 選2?雖然分享后可以顯示圖片,但能保證加載速度? 選3?我肯定選這種,即兼容2的瀏覽器訪問,又能保證訪問速度。 這樣就可以回答上面的問題了!保證瀏覽器訪問要用圖床,保證加載速度要用圖床工具,又不花錢想想就開心。 除此之外本篇博客還會講解...

    并發編程理論篇

    一、必備知識回顧 計算機又叫電腦,即通電的大腦,發明計算機是為了讓他通電之后能夠像人一樣去工作,并且它比人的工作效率更高,因為可以24小時不間斷 計算機五大組成部分 控制器 運算器 存儲器 輸入設備 輸出設備 計算機的核心真正干活的是CPU(控制器+運算器=中央處理器) 程序要想被計算機運行,它的代碼必須要先由硬盤讀到內存,之后cpu取指再執行 并發 看起來像同時運行的就可以稱之為并發 并行 真正...

    Java LinkedHashMap

    Java LinkedHashMap 前言 Map是我們在實際使用過程中常用的集合,HashMap在Java的實際開發中出鏡率很高,它通過hash算法實現了高效的非線程安全的集合,它有一個缺點就是,用戶插入集合的數據時無序,在我們需要一些有序的map的時候,我們就需要引入另外一個集合:LinkedHashMap。 LinkedHashMap是一個有序的非線程安全的集合,它是HashMap的子類,基...

    Spark Streaming處理文件(本地文件以及hdfs上面的文件)

    標題介紹文件流之前先介紹一下Dstream 下面是來自官網一段的說明,Discretized Streams或DStream是Spark Streaming提供的基本抽象。它表示連續的數據流,可以是從源接收的輸入數據流,也可以是通過轉換輸入流生成的已處理數據流。在內部,DStream由一系列連續的RDD表示,這是Spark對不可變的分布式數據集的抽象(有關更多詳細信息,請參見Spark編程指南)。...

    精品国产乱码久久久久久蜜桃不卡