spring data mongodb运行时指定@Document中collection值

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shuaixingrumo/article/details/82151061

需求场景:

有时候我们需要一个模型对象去映射多张集合, 比如每天的运行日志, 每天采集的大量用户数据, 行为数据等, 这样数据库中是有多个集合的, 并且结构相同, 而我们要读取数据的时候, 就需要用同一个对象映射多个集合

解决办法:

使用spring el表达式

数据对象模型:

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection="#{userRepository.collectionName}")
public class User {
    @Id
    private String id;

    private String username;
    private String password;
    private String role;
    private String permission;

    /* getter and setter, toString */
}
#{userRepository.collectionName} userRepository是一个继承MongoRepository的bean对象,collectionName是该对象的一个自定义属性, 用来指定集合名称, 具体代码往下看

编写mongodb的repository

import com.example.BlitzDataStatistics.models.User;
import org.springframework.data.mongodb.repository.MongoRepository;

public interface UserRepository extends MongoRepository<User, String>, UserCustomRepository {
}

可以看到我们的UserRepository不仅继承了接口MongoRepository, 还继承了一个我们自定义的接口UserCustomRepository, 这个自定义接口就是用来设置集合名称的

public interface UserCustomRepository {
    String getCollectionName();
    void setCollectionName(String collectionName);
}

给这个自定义接口添加一个实现类

public class UserCustomRepositoryImpl implements UserCustomRepository {
    private String collectionName="default";

    @Override
    public String getCollectionName() {
        return collectionName;
    }

    @Override
    public void setCollectionName(String collectionName) {
        this.collectionName = collectionName;
    }
}

到此我们就可以用spring el表达式去设置集合名称了, 下面测试代码

package com.example.BlitzDataStatistics;

import com.example.BlitzDataStatistics.models.User;
import com.example.BlitzDataStatistics.mongodb.MongoConfig;
import com.example.BlitzDataStatistics.mongodb.UserRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.List;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MongoConfig.class)
public class tests {
    @Autowired
    private UserRepository ur;

    @Test
    public void test(){
        System.out.println("=========user=========");
        ur.setCollectionName("user");
        List<User> lu = ur.findAll();
        for(User u : lu){
            System.out.println(u);
        }
        System.out.println("===========user2=======");
        ur.setCollectionName("user2");
        lu = ur.findAll();
        for(User u : lu){
            System.out.println(u);
        }
    }
}

先读取集合user中的数据, 再读取集合user2中的数据

测试输出:

=========user=========
User{id='5b3d86c0f9626b11ac000038', username='admin', password='admin', role='admin', permission='1'}
User{id='5b3d86fbf9626b11ac00003c', username='user', password='user', role='user', permission='2'}
===========user2=======
User{id='5b3d86c0f9626b11ac000038', username='admin', password='admin', role='admin', permission='1'}

猜你喜欢

转载自blog.csdn.net/shuaixingrumo/article/details/82151061