摘要:引言之前在項目中經常使用單表查詢,在涉及到多個實體間查詢時,往往直接用云智的綜合查詢庫,怎么查的,一概不知在寫的補考管理時,需求總成績小于成績設置及格成績的顯示出來,綜合查詢庫不能使用,因此對多實體之間的查詢有了一個初步的了解。
引言
之前在項目中經常使用單表查詢,在涉及到多個實體間查詢時,往往直接用云智的綜合查詢庫,怎么查的,一概不知;
在寫Alice的補考管理時,需求:總成績小于(成績設置)及格成績的顯示出來,綜合查詢庫不能使用,因此對多實體之間的查詢有了一個初步的了解。
概述多表查詢需要SpringData提供的JpaSpecificationExecutor接口
實體倉庫需要繼承JpaSpecificationExecutor
public interface ScoreRepository extends CrudRepository, JpaSpecificationExecutor {}
實現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));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); } } }改進
張喜碩組長說:之前那樣寫不太好,不容易理解。
在構建查詢條件是我們還可以這樣寫:
logger.info("構建查詢條件,總成績低于及格成績"); Predicate makeupScorePredicate = root.get("totalScore").as(Float.class) .lessThan(root.join("courseArrangement") .join("course") .join("scoreSet") .get("passScore").as(Float.class))
這樣寫是不是就簡單明了了呢!很容易看出查詢的條件是:總成績低于及格成績
總結平時都是使用云智倉庫進行綜合查詢,沒有什么感覺,就是會用,原理也不清楚,總是很模糊;直到有一天迫不得已自己去寫了,才會對它了解更深一層。
在此,感謝張喜碩組長
參考代碼/** * 根據查詢條件返回查詢成績 * * @param map 查詢條件 */ public static Specificationbase(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("傳入了專業信息"); 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(); } }; }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74636.html
摘要:對關聯另外的實體關聯查詢另外一張表的多個實體如部門實體對應的對象中需要關聯多個子部門實體。對于關聯一個或多個實體的情況,一般通過的實現無的實現方案不寫,不通過的,要更優雅的實現關聯的自動綁定,一個主流的方案就是類似的注解了。 上一篇無SQL實現單表CRUD中我們已經通過Mybatis-plus插件的通用Mapper實現了單表的CRUD的無SQL化,已經可以有效減少Mybatis的代碼量...
閱讀 2975·2021-11-24 10:22
閱讀 3045·2021-11-23 10:10
閱讀 1353·2021-09-28 09:35
閱讀 1752·2019-08-29 13:16
閱讀 1395·2019-08-26 13:29
閱讀 2782·2019-08-26 10:27
閱讀 678·2019-08-26 10:09
閱讀 1436·2019-08-23 18:05