成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

java 多表查詢

nihao / 3213人閱讀

摘要:引言之前在項目中經(jīng)常使用單表查詢,在涉及到多個實體間查詢時,往往直接用云智的綜合查詢庫,怎么查的,一概不知在寫的補考管理時,需求總成績小于成績設置及格成績的顯示出來,綜合查詢庫不能使用,因此對多實體之間的查詢有了一個初步的了解。

引言

之前在項目中經(jīng)常使用單表查詢,在涉及到多個實體間查詢時,往往直接用云智的綜合查詢庫,怎么查的,一概不知;

在寫Alice的補考管理時,需求:總成績小于(成績設置)及格成績的顯示出來,綜合查詢庫不能使用,因此對多實體之間的查詢有了一個初步的了解。

概述

多表查詢需要SpringData提供的JpaSpecificationExecutor接口

實體倉庫需要繼承JpaSpecificationExecutor

public interface ScoreRepository extends CrudRepository, JpaSpecificationExecutor     {}

實現(xiàn)JpaSpecificationExecutor接口中toPredicate方法

 public static Specification base(final Map map) {
    return new Specification() {
     @Override
        public Predicate toPredicate(Root root, CriteriaQuery criteriaQuery, CriteriaBuilder criteriaBuilder) {}
    }

構建查詢條件
logger.info("構建查詢條件,總成績低于及格成績");
Predicate makeupScorePredicate = criteriaBuilder
    .lessThan(root.get("totalScore").as(Float.class), 
    root.join("courseArrangement")
        .join("course")
        .join("scoreSet")
        .get("passScore").as(Float.class));       
andor連接查詢條件

在此以and舉例說明:

 private Predicate predicate = null;
 private CriteriaBuilder criteriaBuilder;

 private void andPredicate(Predicate predicate) {
    // 如果傳入查詢條件不為空
     if (null != predicate) {
         if (null == this.predicate) {
             // 如果該方法之前沒有查詢條件,則直接賦值
             this.predicate = predicate;
         } else {
             // 否則,使用criteriaBuilder的與將已有查詢條件和新查詢條件用and連接
             this.predicate = this.criteriaBuilder.and(this.predicate, predicate);
         }
     }
 }
改進

張喜碩組長說:之前那樣寫不太好,不容易理解。

在構建查詢條件是我們還可以這樣寫:

logger.info("構建查詢條件,總成績低于及格成績");
Predicate makeupScorePredicate = root.get("totalScore").as(Float.class)
    .lessThan(root.join("courseArrangement")
                   .join("course")
                   .join("scoreSet")
                   .get("passScore").as(Float.class))

這樣寫是不是就簡單明了了呢!很容易看出查詢的條件是:總成績低于及格成績

總結
平時都是使用云智倉庫進行綜合查詢,沒有什么感覺,就是會用,原理也不清楚,總是很模糊;直到有一天迫不得已自己去寫了,才會對它了解更深一層。

在此,感謝張喜碩組長

參考代碼
   /**
     * 根據(jù)查詢條件返回查詢成績
     *
     * @param map 查詢條件
     */
    public static Specification base(final Map map) {
        return new Specification() {

            private Predicate predicate = null;
            private CriteriaBuilder criteriaBuilder;

             // 設置and謂語.注意,這里只能設置and關系的謂語,如果謂語為OR,則需要手動設置
            private void andPredicate(Predicate predicate) {
                if (null != predicate) {
                    if (null == this.predicate) {
                        this.predicate = predicate;
                    } else {
                        this.predicate = this.criteriaBuilder.and(this.predicate, predicate);
                    }
                }
            }

             @Override
            public Predicate toPredicate(Root root, CriteriaQuery criteriaQuery, CriteriaBuilder criteriaBuilder) {

                 logger.info("設置私有變量");
                this.criteriaBuilder = criteriaBuilder;

                 logger.info("總評低于及格成績");
                Predicate makeupScorePredicate = criteriaBuilder.lessThan(root.get("totalScore").as(Float.class), root.join("courseArrangement").join("course").join("scoreSet").get("passScore").as(Float.class));
                this.andPredicate(makeupScorePredicate);

                 if (null != map.get("semesterId")) {
                    logger.info("傳入了學期信息");
                    Predicate semesterIdPredicate = criteriaBuilder.equal(root.join("courseArrangement").join("semester").get("id").as(Long.class), map.get("semesterId"));
                    this.andPredicate(semesterIdPredicate);
                }

                 if (null != map.get("gradeId")) {
                    logger.info("傳入了年級信息");
                    Predicate gradeIdPredicate = criteriaBuilder.equal(root.join("student").join("klass").join("grade").get("id").as(Long.class), map.get("gradeId"));
                    this.andPredicate(gradeIdPredicate);
                }

                 if (null != map.get("majorId")) {
                    logger.info("傳入了專業(yè)信息");
                    Predicate majorIdPredicate = criteriaBuilder.equal(root.join("courseArrangement").join("course").join("major").get("id").as(Long.class), map.get("majorId"));
                    this.andPredicate(majorIdPredicate);
                }

                 if (null != this.predicate) {
                    criteriaQuery.where(criteriaBuilder.and(this.predicate));
                }

                 return criteriaQuery.getRestriction();
            }
        };
    }

文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/74636.html

相關文章

  • Mybatis單表CRUD與多表關聯(lián)的無SQL通用方案_2: 無SQL實現(xiàn)關聯(lián)查詢的自動綁定

    摘要:對關聯(lián)另外的實體關聯(lián)查詢另外一張表的多個實體如部門實體對應的對象中需要關聯(lián)多個子部門實體。對于關聯(lián)一個或多個實體的情況,一般通過的實現(xiàn)無的實現(xiàn)方案不寫,不通過的,要更優(yōu)雅的實現(xiàn)關聯(lián)的自動綁定,一個主流的方案就是類似的注解了。 上一篇無SQL實現(xiàn)單表CRUD中我們已經(jīng)通過Mybatis-plus插件的通用Mapper實現(xiàn)了單表的CRUD的無SQL化,已經(jīng)可以有效減少Mybatis的代碼量...

    30e8336b8229 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<