sql >> データベース >  >> NoSQL >> MongoDB

SpringDataMongoリポジトリ::すべてのリポジトリの問題に共通の共有メソッド

    これが最善の解決策です!

    ステップ1:
    インターフェースにカスタムメソッドを追加します!
    增加一部自定义的方法

    #customインターフェース

    /**
     * Basic Repository for common custom methods
     * @author liangping
     */
    
    import java.io.Serializable;
    
    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.Pageable;
    import org.springframework.data.mongodb.core.query.Query;
    import org.springframework.data.mongodb.repository.MongoRepository;
    import org.springframework.data.repository.NoRepositoryBean;
    import org.springframework.data.repository.PagingAndSortingRepository;
    
    @NoRepositoryBean
    public interface WootideRepositoryCustom <T, ID extends Serializable>
          extends PagingAndSortingRepository<T, ID>, MongoRepository<T, ID> {
    
          public Page<T> search(Query query, Pageable pageable);
    }
    

    実装

    ステップ2:
    カスタムメソッドの実装を追加します!
    これ你的自定义方法

    /**
     * implement for wootide basic repository
     * @author liangping
     */
    
    import java.io.Serializable;
    
    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.PageImpl;
    import org.springframework.data.domain.Pageable;
    import org.springframework.data.mongodb.core.MongoOperations;
    import org.springframework.data.mongodb.core.query.Query;
    import org.springframework.data.mongodb.repository.query.MongoEntityInformation;
    import org.springframework.data.mongodb.repository.support.SimpleMongoRepository;
    
    public class WootideRepositoryImpl<T, ID extends Serializable> extends
            SimpleMongoRepository<T, ID> implements WootideRepositoryCustom<T, ID> {
    
        public WootideRepositoryImpl(MongoEntityInformation<T, ID> metadata,
                MongoOperations mongoOperations) {
            super(metadata, mongoOperations);
        }
    
        @Override
        public Page<T> search(Query query, Pageable pageable) {
            long total = this.getMongoOperations().count(query, this.getEntityInformation().getJavaType() );
            return new PageImpl<T>(this.getMongoOperations().find(query.with(pageable), this.getEntityInformation().getJavaType()), pageable, total);
        }
    
    }
    

    カスタムリポジトリ用の新しいファクトリを作成する

    /**
     * Repository Factory for all Subrepository
     * @author liangping
     */
    
    import java.io.Serializable;
    
    import org.springframework.data.mongodb.core.MongoOperations;
    import org.springframework.data.mongodb.core.mapping.BasicMongoPersistentEntity;
    import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
    import org.springframework.data.mongodb.repository.MongoRepository;
    import org.springframework.data.mongodb.repository.query.MongoEntityInformation;
    import org.springframework.data.mongodb.repository.support.MappingMongoEntityInformation;
    import org.springframework.data.mongodb.repository.support.MongoRepositoryFactory;
    import org.springframework.data.mongodb.repository.support.MongoRepositoryFactoryBean;
    import org.springframework.data.repository.core.RepositoryMetadata;
    import org.springframework.data.repository.core.support.RepositoryFactorySupport;
    import org.springframework.data.util.ClassTypeInformation;
    import org.springframework.data.util.TypeInformation;
    
    public class WootideRepositoryFactoryBean<R extends MongoRepository<T, I>, T, I extends Serializable>
            extends MongoRepositoryFactoryBean<R, T, I> {
    
        @Override
        protected RepositoryFactorySupport getFactoryInstance(
                MongoOperations operations) {
            return new WootideMongoRepositoryFactory<T,I>( operations );
        }
    
        private static class WootideMongoRepositoryFactory<T, ID extends Serializable>
                extends MongoRepositoryFactory {
    
            private MongoOperations mongo;
            public WootideMongoRepositoryFactory(MongoOperations mongoOperations) {
                super(mongoOperations);
                this.mongo = mongoOperations;
            }
    
            @SuppressWarnings("unchecked")
            protected Object getTargetRepository(RepositoryMetadata metadata) {
    
                TypeInformation<T> information =  ClassTypeInformation.from((Class<T>)metadata.getDomainType());
                MongoPersistentEntity<T> pe = new BasicMongoPersistentEntity<T>(information);
                MongoEntityInformation<T,ID> mongometa = new MappingMongoEntityInformation<T, ID>(pe);
    
                return new WootideRepositoryImpl<T, ID>( mongometa,  mongo);
            }
    
            protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {
                return WootideRepositoryCustom.class;
            }
        }
    }
    

    動作させる

    <mongo:repositories base-package="com.***.mongodb" 
    factory-class="com.***.mongodb.custom.WootideRepositoryFactoryBean"/>
    

    幸運を!祝你好运!



    1. mongodbは、ポイントがポリゴン内にあるかどうかを確認します

    2. BookSleeveでredisのコンテンツ値を検索する方法

    3. セッションストアにexpress/redisを使用する場合、「session」は未定義です

    4. 複合インデックスの順序は、パフォーマンスの観点からMongoDBでどのように重要ですか?