成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

java 多表查詢

nihao / 3149人閱讀

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

引言

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

在寫Alice的補(bǔ)考管理時(shí),需求:總成績(jī)小于(成績(jī)?cè)O(shè)置)及格成績(jī)的顯示出來(lái),綜合查詢庫(kù)不能使用,因此對(duì)多實(shí)體之間的查詢有了一個(gè)初步的了解。

概述

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

實(shí)體倉(cāng)庫(kù)需要繼承JpaSpecificationExecutor

public interface ScoreRepository extends CrudRepository, JpaSpecificationExecutor     {}

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

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

構(gòu)建查詢條件
logger.info("構(gòu)建查詢條件,總成績(jī)低于及格成績(jī)");
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);
         }
     }
 }
改進(jìn)

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

在構(gòu)建查詢條件是我們還可以這樣寫:

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

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

總結(jié)
平時(shí)都是使用云智倉(cāng)庫(kù)進(jìn)行綜合查詢,沒有什么感覺,就是會(huì)用,原理也不清楚,總是很模糊;直到有一天迫不得已自己去寫了,才會(huì)對(duì)它了解更深一層。

在此,感謝張喜碩組長(zhǎng)

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

            private Predicate predicate = null;
            private CriteriaBuilder criteriaBuilder;

             // 設(shè)置and謂語(yǔ).注意,這里只能設(shè)置and關(guān)系的謂語(yǔ),如果謂語(yǔ)為OR,則需要手動(dòng)設(shè)置
            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("設(shè)置私有變量");
                this.criteriaBuilder = criteriaBuilder;

                 logger.info("總評(píng)低于及格成績(jī)");
                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("傳入了學(xué)期信息");
                    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("傳入了年級(jí)信息");
                    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();
            }
        };
    }

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74636.html

相關(guān)文章

  • Mybatis單表CRUD與多表關(guān)聯(lián)的無(wú)SQL通用方案_2: 無(wú)SQL實(shí)現(xiàn)關(guān)聯(lián)查詢的自動(dòng)綁定

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

    30e8336b8229 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<