MongoRepository的多条件查询和排序功能

3 篇文章 0 订阅
1 篇文章 0 订阅

继承MongoRepository<T, ID>也太香了吧

mongonDB作为非关系型数据库
是非关系数据库当中功能最丰富,最像关系数据库的。因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,而且还支持对数据建立索引,分页查询、多条件查询和排序功能这都不是问题。
不光香,还能造!能够减轻数据库的压力,提高系统性能.
首先直接上依赖

  <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
            <version>2.1.6.RELEASE</version>
        </dependency>

springBoot的yml配置
option是设置超时时间,跟,不喜欢这么多的 可以删掉,假如报错再贴上去吧哈哈

spring:
  data:
    mongodb:
      uri: mongodb://账号:密码@服务器名称:27017
      database: 集合名称(库名)
      option:
        min-connection-per-host: 20
        max-connection-per-host: 200
        threads-allowed-to-block-for-connection-multiplier: 5
        server-selection-timeout: 30000
        max-wait-time: 120000
        max-connection-idle-time: 0
        max-connection-life-time: 0
        connect-timeout: 20000
        socket-timeout: 0
        socket-keep-alive: false
        ssl-enabled: false
        ssl-invalid-host-name-allowed: false
        always-use-m-beans: false
        heartbeat-socket-timeout: 20000
        heartbeat-connect-timeout: 20000
        min-heartbeat-frequency: 500
        heartbeat-frequency: 10000
        local-threshold: 15

是前辈留给我们的好产物,一定要放心使用。
创建接口继承我们的MongoRepository

public interface AutomationBWHWebRepository extends MongoRepository<实体类名,主键id> {
}

实体类 @Doucment(collection="")是映射到的表名 上边的是Lombok


@Data
@ToString
@Document(collection = "mongoDB表明")
public class AutomationBWHWeb {
	//mongoDb上的主键
    @Id
    private String Id;

路铺好了 直接上内容代码了

package org.springframework.data.repository.query;

import java.util.Optional;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;

public interface QueryByExampleExecutor<T> {
    <S extends T> Optional<S> findOne(Example<S> var1);

    <S extends T> Iterable<S> findAll(Example<S> var1);

    <S extends T> Iterable<S> findAll(Example<S> var1, Sort var2);
	
    <S extends T> Page<S> findAll(Example<S> var1, Pageable var2);

    <S extends T> long count(Example<S> var1);

    <S extends T> boolean exists(Example<S> var1);
}

贴出MongoRepository的findAll()查询源码,随机选用一条 那就是它把
Page findAll(Example var1, Pageable var2)
Example是自行封装的查询条件 下边有介绍 ,而这个Pageable 我们再看看源码,需要的是什么参数。 贴得不是很全,建议大家在编译器中去好好看看。

算了 我挺难的,全部贴出来可能会脑瓜子嗡嗡的。
PageRequest是继承了AbstractPageRequest又实现了 Pageable所以!我们可以用这个对象

	//静态构造方法   分页加时间排序的功能,Sort也就是我们根据字段排序的一个条件
    public static PageRequest of(int page, int size, Sort sort) {
        return new PageRequest(page, size, sort);
    }

最后最后!!正题!

//参数参数条件
public QueryResult findHospitalH5(Map<String, String> queryPageRequest) {
        int page = Integer.parseInt(queryPageRequest.get("currentPage"));
        int size = Integer.parseInt(queryPageRequest.get("pageSize"));
        String hospitalName = queryPageRequest.get("hospitalName");
        String remark = queryPageRequest.get("remark");

        //创建查询条件对象
        ExampleMatcher exampleMatcher = ExampleMatcher.matching().
        		//remark表示查询字段名称
                withMatcher("remark", ExampleMatcher.GenericPropertyMatchers.contains()).
                withMatcher("hospitalName", 
                //ExampleMatcher.GenericPropertyMatchers.contains()表示包含的意思还需要更多需求的,文章下方有其余方法,包括结尾是,全匹配等
                ExampleMatcher.GenericPropertyMatchers.contains());
         //创建实体类      
        AutomationBWHH5 information = new AutomationBWHH5();
        //将所需要条件查询的值set到实体类中
        if (!StringUtils.isEmpty(hospitalName)) {
            information.setHospitalName(hospitalName);
        }
        if (!StringUtils.isEmpty(remark)) {
            information.setRemark(remark);
        }
		//缝合条件
        Example<AutomationBWHH5> example = Example.of(information, exampleMatcher);
		//设置分页,这里page页码是不允许为0的
        if (page <= 0) {
            page = 1;
        }
        if (size == 0) {
            size = 10;
        }
        //???假如觉得麻烦,按照自己需求来 哈哈哈
        page = page - 1;
       
        //Sort.Direction.DESC  这里是按照集合表里边的sortDate字段进行正向排序,我的是在实体类中设置的字段为Date
        Sort sort = new Sort(Sort.Direction.DESC,"sortDate");
         //分页查询
        Pageable pageable = new PageRequest(page, size,sort);
		
        Page<AutomationBWHH5> requestPage = automationBWHH5Repository.findAll(example, pageable);
        QueryResult queryResult = new QueryResult();
        queryResult.setTotal(requestPage.getTotalElements());
        queryResult.setList(requestPage.getContent());
        return queryResult;
    }

ExampleMatcher.GenericPropertyMatchers.->
在这里插入图片描述
根据需要自行匹配。不恰当的地方,大佬批评指正!
在这里插入图片描述
觉得很香的小伙伴一定要告诉妈妈!

MongoRepository 是 Spring Data MongoDB 模块提供的一种基于接口的 MongoDB 操作方式。它提供了很多现成的方法,可以方便地对 MongoDB 进行增删改查操作。其中,分页条件查询可以通过继承 PagingAndSortingRepository 接口来实现。 下面是一个示例代码,演示了如何在 MongoRepository 中进行分页条件查询: ```java public interface UserRepository extends MongoRepository<User, String> { // 根据条件查询,并进行分页 Page<User> findByAgeGreaterThan(int age, Pageable pageable); } ``` 在上面的代码中,我们定义了一个 UserRepository 接口,继承了 MongoRepository 接口,并指定了实体类 User 和 ID 类型为 String。然后,我们定义了一个方法 findByAgeGreaterThan,用于根据年龄大于某个值的条件进行查询,并对结果进行分页。该方法的返回值类型为 Page<User>,其中的 Page 对象就是 Spring 提供的分页对象,可以通过该对象来获取查询结果和分页信息。 在调用该方法时,我们可以传入一个 Pageable 对象,用于指定分页信息。例如: ```java Pageable pageable = PageRequest.of(0, 10, Sort.by("name").ascending()); Page<User> page = userRepository.findByAgeGreaterThan(18, pageable); ``` 在上面的代码中,我们创建了一个 Pageable 对象,指定了第一页、每页 10 条记录,按照 name 字段升序排序。然后,调用了 UserRepository 的 findByAgeGreaterThan 方法,并传入了该 Pageable 对象作为参数。最后,我们可以通过 page 对象来获取查询结果和分页信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值