微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

spring mongodb分页,动态条件、字段查询

使用MongRepository

public interface VideoRepository extends MongoRepository<Video, String> {
    Video findVideoById(String id);
    // 视频分页预览{title,coverImg}
    Page<Video> findByGradeAndCourse(Grade grade, Course course, Pageable page);
}
  1. 指定字段
@Query(fields = "{'title':1, 'coverImg':1, 'course':1}")
Page<Video> findBy(Criteria where, Pageable page);
  1. 指定条件
DBObject obj = new BasicDBObject();
obj.put("userId", new BasicDBObject("$gte", 2));

BasicDBObject fieldsObject = new BasicDBObject();
fieldsObject.put("userId", 1);
fieldsObject.put("name", 1);

Query query = new BasicQuery(obj.toString(), fieldsObject.toString());
  • demo,使用MongoTemplate,Query,DBObject
@Override
    public Result getVideos(Pageable page, Long gradeId, Long courseId) {
        DBObject obj = new BasicDBObject();
        if(gradeId!=null&&gradeId!=0){
            obj.put("grade.id", gradeId);
        }
        if(gradeId!=null&&gradeId!=0){
            obj.put("course.id", courseId);
        }
        obj.put("course.id", 2);
//        obj.put("course.id", new BasicDBObject("$gte", 2));

        BasicDBObject fieldsObject = new BasicDBObject();
        fieldsObject.put("title", 1);
        fieldsObject.put("coverImg", 1);
        fieldsObject.put("course", 1);
        Query query = new BasicQuery(obj.toString(), fieldsObject.toString());
        query.skip(page.getoffset()).limit(page.getPageSize());
        List<Video> videos = mongoTemplate.find(query, Video.class);
        // 总个数
        long count = mongoTemplate.count(query, Video.class);
        Page<Video> result = new PageImpl<Video>(videos, page, count);
        return Result.success(videos);
    }

查询条件对于属性是对象(course)无法生效,该方法还是不可行

混合 (终极法器)

本质上还是使用MongoTemplate来实现的,MongoRepository能实现查询指定字段,但是不能实现动态条件查询

MongoTemplate的find方法接收Query参数,Query可以实现动态字段,但是动态条件不是普适应的(我还没找到),对于对象属性无法查询。但是Query有一个addCriteria方法,该方法可以将Example融合到Query中。因此find方法使用了Example的动态查询,Query的动态字段查询

  • VidoeOperations
public interface VideoOperations {
    Page<Video> findAllPage(Example<Video> example, DBObject fields, Pageable page);
}
  • VideoRepository
public interface VideoRepository extends MongoRepository<Video, String>, VideoOperations {
    Video findVideoById(String id);
}
  • VideoRepositoryImpl
public class VideoRepositoryImpl implements VideoOperations {
    @Autowired
    private MongoTemplate mongoTemplate;
    @Override
    public Page<Video> findAllPage(Example<Video> example, DBObject fields, Pageable page) {
        Query query = new BasicQuery(null, fields.toString());
        query.addCriteria((new Criteria()).alike(example));
        query.with(page);
//        Query q = (new Query((new Criteria()).alike(example))).with(page);
        List<Video> list = mongoTemplate.find(query, example.getProbeType());
        return PageableExecutionUtils.getPage(list, page, () -> {
            return mongoTemplate.count(query, example.getProbeType());
        });
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐