JAvaマルチテーブルクエリー

5298 ワード

引用する
以前はプロジェクトで単表クエリーをよく使用していましたが、複数のエンティティ間クエリーに関連する場合、クラウドインテリジェントな総合クエリーライブラリを直接使用することが多く、どのように調べたのか、一切知りませんでした.
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));       
    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))

    このように書くと簡単にわかるのではないでしょうか.調査の条件は、総成績が合格成績を下回っていることがわかりやすい.
    まとめ
    普段は雲智倉庫を使って総合的な検索を行っていますが、何の感じもありません.ある日やむを得ず自分で書いてから、もっと深く理解することができます.
    ここで、張喜碩組長に感謝します.
    リファレンスコード
       /**
         *             
         *
         * @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("       ");
                        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();
                }
            };
        }