关于mongoTemplate的条件分页查询封装方法

先上实体类

@Document
@Data        //lombok插件
public class Profile {
    @Id
    private String id;
    @Indexed
    private String userId;
    @Indexed
    private String name;
    private DesignerType type;
    private String pic;
    private Integer sex;
    private String wechat;
    private String qq;
    private String weibo;
    private String description;
    private String address;
    private Date createAt;
    private Date updateAt;
    @Indexed(unique = true)
    private String inviteCode;
    private int inviteCodeUsedCount;
    private Date becomeDesignerDate;
}

以上是实体类,没毛病,get set方法已经通过lombok组件搞定,接着上传查询代码

 public List<Profile> searchProfiles(Integer page, Integer size, String filter) {
        Profile profile = new Profile();
        profile.setName(filter);

        Query query = new Query();
        if (filter!=null && !filter.isEmpty()){
            query.addCriteria(new Criteria().alike(Example.of(profile,
                    ExampleMatcher.matching()
                            .withIgnoreNullValues()
                            .withIgnorePaths("inviteCodeUsedCount")
                            .withIgnoreCase()
                            .withMatcher("name", matcher -> matcher.contains())
            )));
        }
        List<Profile> profiles = mongoTemplate.find(
                query.skip(page * size).limit(size).with(new Sort(Sort.Direction.DESC, "createAt")),
                Profile.class
        );
        return profiles;
    } 

入参分别是页码,每页次数和查询条件,将查询条件封装到实体类,然后创建Query对象,在query对象里添加Criteria对象,做模糊查询,将刚建好的profile实体类传入进去

重点来了,ExampleMatcher.matching()这个代码是进行匹配的,以前压根就没搞过类似的代码,所以一窍不通,其中第一行.

    withIgnoreNullVlaues()意思是忽略空值,字段中有空值的时候要忽略,否则查不出准确的条件查询结果;

    withIgnorePaths(), 这是我踩坑最傻的一次,这个方法的入参要传入所有的有初始值的字段,比如boolean类型的初始值就是false,否则的话是查不到结果集的,我掉进去很长一段时间爬不起来,切记切记!

    后面就不说了,其实我只想说上一个,其余的没必要说了


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的MongoDB分页查询工具类的实现,使用了MongoTemplate和PageRequest: ```java import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; public class MongoPageUtils<T> { /** * 分页查询 * @param mongoTemplate mongoTemplate实例 * @param collectionName 集合名称 * @param pageNo 页号 * @param pageSize 每页大小 * @param sortField 排序字段 * @param sortOrder 排序方式 * @param query 查询条件 * @param clazz 返回结果类型 * @return 分页结果 */ public Page<T> findPage(MongoTemplate mongoTemplate, String collectionName, int pageNo, int pageSize, String sortField, Sort.Direction sortOrder, Query query, Class<T> clazz) { // 分页查询条件 PageRequest pageRequest = PageRequest.of(pageNo - 1, pageSize, sortOrder, sortField); // 查询总记录数 long totalCount = mongoTemplate.count(query, clazz, collectionName); // 分页查询 query.with(pageRequest); // 执行查询 return new PageImpl<>(mongoTemplate.find(query, clazz, collectionName), pageRequest, totalCount); } /** * 分页查询 * @param mongoTemplate mongoTemplate实例 * @param collectionName 集合名称 * @param pageNo 页号 * @param pageSize 每页大小 * @param sortField 排序字段 * @param sortOrder 排序方式 * @param criteria 查询条件 * @param clazz 返回结果类型 * @return 分页结果 */ public Page<T> findPage(MongoTemplate mongoTemplate, String collectionName, int pageNo, int pageSize, String sortField, Sort.Direction sortOrder, Criteria criteria, Class<T> clazz) { // 查询条件 Query query = new Query(criteria); // 分页查询 return findPage(mongoTemplate, collectionName, pageNo, pageSize, sortField, sortOrder, query, clazz); } } ``` 使用方法: ```java MongoPageUtils<User> pageUtils = new MongoPageUtils<>(); // 查询条件 Criteria criteria = Criteria.where("age").gt(18); // 排序条件 Sort sort = Sort.by(Sort.Direction.DESC, "createTime"); // 分页查询 Page<User> page = pageUtils.findPage(mongoTemplate, "user", 1, 10, "createTime", sort.getDirection(), criteria, User.class); // 获取分页结果 List<User> userList = page.getContent(); ``` 其中,MongoTemplate是Spring提供的操作MongoDB的工具类,可以在项目启动时进行注入。对于查询条件和排序条件,可以使用Criteria和Sort类进行构造。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值