摘要:引言之前在項(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構(gòu)建查詢條件base(final Map map) { return new Specification () { @Override public Predicate toPredicate(Root root, CriteriaQuery> criteriaQuery, CriteriaBuilder criteriaBuilder) {} }
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));and、 or連接查詢條件
在此以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 Specificationbase(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
摘要:對(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的代碼量...
閱讀 3012·2021-11-24 10:22
閱讀 3058·2021-11-23 10:10
閱讀 1367·2021-09-28 09:35
閱讀 1761·2019-08-29 13:16
閱讀 1400·2019-08-26 13:29
閱讀 2798·2019-08-26 10:27
閱讀 687·2019-08-26 10:09
閱讀 1450·2019-08-23 18:05