MongoDBの多くの条件のページングクエリ

Zuoren記事が教えられています - 私は言葉遣いを知りません

@Autowired 
プライベートMongoTemplate mongoTemplate。

@Autowired 
プライベートMongoPageHandler mongoPageHandler。

公共の一覧<地図>ハンドラ(QueryDataByConditionsCommandコマンド)EasywareException {スロー
        基準基準=新基準を(); 
        Validate.execAssert(command.getInstanceItems()= NULL、 "设置默认查询条件请"!)。
        mongoPageHandler.jointParams(command.getInstanceItems()、基準)。
        ページング可能ページング可能=新しいPageRequest(command.getOffset()、command.getLimit()); 
        一覧<地図>結果= mongoTemplate.find(新しいクエリ()。addCriteria(基準).with(ページング可能).with(新しいソート(Direction.ASC、 "日付"))、Map.class、command.getEntityName()) ; 
        結果を返します。
}

 

MongoPageHandler:

輸入com.easyware.comman.controller.PagedQueryResult。
輸入com.easyware.comman.domain.AuditEntity。
輸入com.google.common.collect.Lists。
輸入java.util.HashMapを; 
インポートするjava.util.Iterator; 
輸入はjava.util.List; 
輸入java.util.Map; 
輸入java.util.UUID。
輸入org.springframework.beans.factory.annotation.Autowired; 
輸入org.springframework.data.domain.Sort。
輸入org.springframework.data.domain.Sort.Direction。
輸入org.springframework.data.domain.Sort.Order。
輸入org.springframework.data.mongodb.core.MongoTemplate。
輸入org.springframework.data.mongodb.core.query.Criteria。
輸入org.springframework.data.mongodb.core.query.Query。
輸入org.springframework.stereotype.Component。

@Component 
パブリッククラスMongoPageHandler { 
    = 1のpublic static final int型FIRST_PAGE_NUM。
    public static final String型のID = "_id"。
    public static final String型のCREATE_TIME = "CREATETIME"。
    民間最終MongoTemplate mongoTemplate。

    @Autowired 
    公共MongoPageHandler(MongoTemplate mongoTemplate){ 
        this.mongoTemplate = mongoTemplate。
    } 

    パブリック<Tが延びるAuditEntity> PagedQueryResult <T> pageQuery(地図の<string、オブジェクト> paramsMap、クラス<T> entityClass、整数のpageSize、整数PAGENUM、文字列lastId、ブールisNextPage){
        this.jointParams(paramsMap、基準)。 
        クエリのクエリ=新しいクエリ()。
        基準の基準=新基準(); 
        query.addCriteria(基準)。
        長い合計= this.mongoTemplate.count(クエリ、entityClass)。
        整数ページ=(int型)Math.ceil((ダブル)の合計/(ダブル)のpageSize)。
        IF(PAGENUM <= 0 || PAGENUM>ページ){ 
            PAGENUM = 1。
        } 

        IF(!PAGENUM = 1){ 
            IF(isNextPage){ 
                。criteria.and( "_ ID")GT(UUID.fromString(lastId))。
            }他{ 
                criteria.and( "_ ID")LT(UUID.fromString(lastId))。
            } 
        } 

        query.limit(pageSizeを)。
        query.addCriteria(基準)。
        リスト<T> entityList = this.mongoTemplate.find(クエリ、entityClass)。
        PagedQueryResult <T> pagedQueryResult =新しいPagedQueryResult()。
        pagedQueryResult.setTotal((INT)の合計)。
        pagedQueryResult.setList(entityList)。
        pagedQueryResultを返します。
    } 

    公共PagedQueryResult <T> pageQuery <TはAuditEntity延び>(地図<文字列、オブジェクト> paramsMap、クラス<T> entityClass、整数の上限を、整数、ソート、ソート、列COLLECTIONNAMEオフセット){ 
        クエリのクエリ=新しいクエリ()。
        基準の基準=新基準(); 
        this.jointParams(paramsMap、基準)。
        query.addCriteria(基準)。
        長い合計= COLLECTIONNAME == nullの?this.mongoTemplate.count(クエリ、entityClass):this.mongoTemplate.count(クエリ、entityClass、COLLECTIONNAME)。
        整数ページ=(INT)Math.ceil((二重)の合計/(ダブル)限界)。
        PagedQueryResult <T> pagedQueryResult =新しいPagedQueryResult()。
        pagedQueryResult.setTotal((INT)の合計)。
        (オフセット<= 0)場合、{ 
            = 1を相殺。
        }(>ページオフセット)他の場合は{ 
            pagedQueryResultを返します。
        } 

        (ヌル=ソート!){もし
            query.with(ソート)。
        }他{ 
            query.with(Sort.by(Lists.newArrayList(新しい注文[] {新規注文(Direction.DESC、 "CREATETIME")})))。
        }
 
        INT(オフセット- 1)* =制限をスキップ。
        (スキップ)(ロング).limit(制限)query.skip。
        リスト<T> entityList = COLLECTIONNAME == nullの?this.mongoTemplate.find(クエリ、entityClass):this.mongoTemplate.find(クエリ、entityClass、COLLECTIONNAME)。
        pagedQueryResult.setList(entityList)。
        pagedQueryResultを返します。
    } 

    公共ボイドjointParams(地図の<string、オブジェクト> paramsMap、基準条件){ 
        地図<文字列、MongoPageHandler.ScopeParams>マップ=新しいHashMapの()。
        。反復子VAR4 = paramsMap.keySet()反復子(); 

        一方、(var4.hasNext()){ 
            文字列COL =(文字列)var4.next(); 
            文字列str; 
            オブジェクトobj;  
                STR = col.replace( "から"、 "");
            MongoPageHandler.ScopeParams scopeParams;
            IF(col.contains() "から"){ 
                OBJ = paramsMap.get(COL)。
                scopeParams =(MongoPageHandler.ScopeParams)map.get(STR)。
                IF(scopeParams == NULL){ 
                    scopeParams =新しいMongoPageHandler.ScopeParams()。
                    scopeParams.name = STR。
                    map.put(STR、scopeParams)。
                } 

                scopeParams.gteValue = OBJ。
            }そうであれば(col.contains( "から")){ 
                STR = col.replace( "を"、 ""); 
                OBJ = paramsMap.get(COL)。
                scopeParams =(MongoPageHandler.ScopeParams)map.get(STR)。
                    scopeParams =新しいMongoPageHandler.ScopeParams();
                    scopeParams.name = STR。
                    map.put(STR、scopeParams)。
                } 

                scopeParams.lteValue = OBJ。
            }そうであれば(paramsMap.getストリングのinstanceof(COL)){ 
                STR =「^ [0-9A-F] {8} - [0-9A-F] {4} - [0-9A-F] {4} - [0-9A-F] {4} - [0-9A-F] {12} $ "。
                IF(((文字列)paramsMap.get(COL))と一致する(「^ [0-9A-F] {8} - [0-9A-F] {4} - [0-9A-F] {4} - [0-9A-F] {4} - [0-9A-F] {12} $ ")){ 
                    criteria.and(COL).is(UUID.fromString(paramsMap.get(COL).toString() )); 
                    System.out.println(UUID.fromString(paramsMap.get(COL).toString()))。
                }他{
                    criteria.and(COL).regex( "*?" + paramsMap.get(COL)+、 "I"、 "*。"); 
                } 
            }他{ 
                criteria.and(COL).is(paramsMap.get(COL))。
            } 
        } 

        。VAR4 = map.values()反復子(); 

        一方、(TRUE){ 
            一方(var4.hasNext()){ 
                MongoPageHandler.ScopeParams SP =(MongoPageHandler.ScopeParams)var4.next(); 
                IF(!sp.gteValue = NULL && sp.lteValue = NULL){ 
                    criteria.and(sp.name).gte(sp.gteValue).lte(sp.lteValue)。
                }そうであれば(!sp.gteValue = NULL){ 
                    criteria.and(sp.name).gte(sp.gteValue)。
                }他{ 
                    criteria.and(sp.name).lte(sp.lteValue)。
                } 
            } 

            を返します。
        } 
    } 

    publicクラスScopeParams { 
        公共の文字列名。
        パブリックオブジェクトgteValue。
        パブリックオブジェクトlteValue。

        パブリックScopeParams(){ 
        } 
    } 
}

  

おすすめ

転載: www.cnblogs.com/mxh-java/p/11590367.html