分别通过mongoTemplate聚合查询(带参数模糊查询)分页、Jpa查询(带参数模糊查询)分页

1、通过Jpa查询(带参数)分页

1.1)Java

/** * *方式一:基于MongoRepository *优势:方便简单,方法实现由工具类完成。 *缺点:不适合多个可变查询条件。 */
Controller
@RequestMapping("selectStudentPagerByJpa")
@ResponseBody
public Object selectStudentPagerByJpa(@RequestParam(value = "page") String page,@RequestParam(value = "rows") String rows) {
    Map<String,Object> result = new HashMap<String,Object>();
    try {
        Page<StudentBo> studentBos = studentService.queryAllByPage(Integer.parseInt(page),Integer.parseInt(rows));
        List<StudentBo> studentBoList = studentBos.getContent();
        for (StudentBo studentBo : studentBoList) {
            String courseName = null;
            List<CourseBo> courses = studentBo.getCourses();
            for (CourseBo course : courses) {
                if (StringUtils.isBlank(courseName)) {
                    courseName = course.getCname();
                } else {
                    courseName += "," + course.getCname();
                }
            }
            studentBo.setCoursesName(courseName);
        }
        result.put("total",studentBos.getTotalElements());
        result.put("rows",studentBos.getContent());
    } catch (Exception e) {
        log.error(e);
    }
    return result;
}

Service
public Page<StudentBo> queryAllByPage(int page,int rows) throws Exception {
    PageRequest pageRequest = new PageRequest(page - 1,rows,new Sort(new Sort.Order(Sort.Direction.DESC,"id")));
    return iStudentDao.findAll(pageRequest);
}

dao
@Repository
public interface IStudentDao extends MongoRepository<StudentBo,ObjectId> {
    public Page<StudentBo> findBySnameLike(String Sname,Pageable pageable);
}

带分页的模糊查询
Controller
@RequestMapping("findBySnameLike")
@ResponseBody
public Object findBySnameLike(@RequestParam(value = "page",defaultValue = "1") String page,@RequestParam(value = "rows",defaultValue = "10") String rows,@RequestParam(value = "sname") String sname) {
    Map<String,Object>();
    try {
        Page<StudentBo> studentBos = studentService.findBySnameLike(Integer.parseInt(page),Integer.parseInt(rows),sname);
        result.put("total",studentBos.getContent());
    } catch (Exception e) {
        e.printStackTrace();
    }
    return result;
}

service
public Page<StudentBo> findBySnameLike(int page,int rows,String sname) {
    Pageable pageRequest = new PageRequest(page-1,"id")));
    return iStudentDao.findBySnameLike(sname,pageRequest);
}

dao
@Repository
public interface IStudentDao extends MongoRepository<StudentBo,ObjectId> {

    public Page<StudentBo> findBySnameLike(String sname,Pageable pageRequest);
}

2、通过mongoTemplate聚合查询(带参数)分页

2.1)mongo原生查询语句

2.2)Java

/** * *方式二:通过mongoTemplate聚合查询分页 *优势:方便简单,方法实现由工具类完成。 *缺点:适合多个可变查询条件。 */
Controller
@RequestMapping("selectStudentPagerByMongoTemplate")
@ResponseBody
public Object selectStudentPagerByMongoTemplate(
       @RequestParam(value = "page") String page,@RequestParam(value = "rows") String rows,@RequestParam(value = "sname",defaultValue = "") String sname) {
   Map<String,Object>();
   try {
       //方式一:通过mongoTemplate聚合查询分页
       PagerBo pagerBo = new PagerBo(Integer.parseInt(page),Integer.parseInt(rows));
       StudentBo student = new StudentBo();
       student.setSname(sname);
       pagerBo = studentService.getStudentPagerByMongoTemplate(student,pagerBo);
       List<StudentBo> studentBoList = pagerBo.getResult();
       for (StudentBo studentBo : studentBoList) {
           String courseName = null;
           List<CourseBo> courses = studentBo.getCourses();
           for (CourseBo course : courses) {
               if (StringUtils.isBlank(courseName)) {
                   courseName = course.getCname();
               } else {
                   courseName += "," + course.getCname();
               }
           }
           studentBo.setCoursesName(courseName);
       }
       result.put("total",pagerBo.getTotal());
       result.put("rows",studentBoList);
   } catch (Exception e) {
       log.error(e);
   }
   return result;
}

Service
public PagerBo getStudentPagerByMongoTemplate(StudentBo studentBo,PagerBo pagerBo) {
    return studentDao.getStudentPagerByMongoTemplate(studentBo,pagerBo);
}

Dao
public PagerBo getStudentPagerByMongoTemplate(StudentBo studentBo,PagerBo pagerBo) {
    List<AggregationOperation> operations = new ArrayList<AggregationOperation>();
    operations.add(Aggregation.skip(pagerBo.getStart()));
    operations.add(Aggregation.limit(pagerBo.getRows()));
    operations.add(Aggregation.lookup("course","_id","students._id","courses"));
    operations.add(Aggregation.sort(Sort.Direction.DESC,"id"));
    if (StringUtils.hasText(studentBo.getSname())) {
        operations.add(Aggregation.match(Criteria.where("sname").
                regex(".*?\\" + studentBo.getSname() + ".*")));
    }

    Aggregation aggregation = Aggregation.newAggregation(operations);
    /*Aggregation aggregation = Aggregation.newAggregation( Aggregation.skip(pagerBo.getStart()),Aggregation.limit(pagerBo.getRows()),Aggregation.lookup("course","_id","students._id","courses"),Aggregation.sort(Sort.Direction.DESC,"id") //,Aggregation.match(Criteria.where("sname").is(studentBo.getSname())) );*/
    long total = mongoTemplate.count(new Query(),StudentBo.class);
    AggregationResults<StudentBo> results = mongoTemplate.aggregate(aggregation,"student",StudentBo.class);
    pagerBo.setResult(results.getMappedResults());
    pagerBo.setTotal(total);
    return pagerBo;
}

3.Jsp(通过easyui实现)

3.1)列表显示

<table id="dg" title="学生列表" class="easyui-datagrid" style="width:700px;height:250px" url="selectStudentPagerByMongoTemplate.do" toolbar="#toolbar" pagination="true" rownumbers="true" fitColumns="true" singleSelect="true">
    <thead>
        <tr>
            <th field="sname" width="50">学生姓名</th>
            <th field="coursesName" width="50">课程名</th>
        </tr>
    </thead>
</table>

3.2)列表查询

Jsp
<input id="sname" class="easyui-searchbox" style="width:300px" data-options="searcher:findByStudentNameLike,prompt:'请输入学生姓名'"></input>

Js
//实现方式一()[参考地址]http://www.jeasyui.net/tutorial/22.html)
function findByStudentNameLike() {
   $('#dg').datagrid('load',{
        sname: $('#sname').val()
    });
}

//实现方式二(不推荐使用:需要重新写一个带参数的分页查询)
var sname= $('#sname').val();
$("#dg").datagrid({
    title: '用户信息',iconCls: 'icon-ok',pageSize: 10,pageList: [5,10,15,20],nowrap: true,striped: true,collapsible: true,toolbar: "#easyui_toolbar",url: 'findBySnameLike.do?sname=' + sname,//触发此action,带上参数searcValue
    loadMsg: '数据加载中......',fitColumns: true,//允许表格自动缩放,以适应父容器
    sortName: 'id',sortOrder: 'asc',remoteSort: false,columns: [[{
        field: 'id',title: 'id',hidden: true
    },{
        field: 'sname',title: '学生姓名',width: '165px'
    },{
        field: 'coursesName',title: '课程名',width: '165px'
    }
    ]],pagination: true,rownumbers: true
})

个人心得:选用的方式看:是否适合多个可变查询条件。

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

相关推荐


什么是设计模式一套被反复使用、多数人知晓的、经过分类编目的、代码 设计经验 的总结;使用设计模式是为了 可重用 代码、让代码 更容易 被他人理解、保证代码 可靠性;设计模式使代码编制  真正工程化;设计模式使软件工程的 基石脉络, 如同大厦的结构一样;并不直接用来完成代码的编写,而是 描述 在各种不同情况下,要怎么解决问题的一种方案;能使不稳定依赖于相对稳定、具体依赖于相对抽象,避免引
单一职责原则定义(Single Responsibility Principle,SRP)一个对象应该只包含 单一的职责,并且该职责被完整地封装在一个类中。Every  Object should have  a single responsibility, and that responsibility should be entirely encapsulated by t
动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强烈推荐。原文截图*************************************************************************************************************************原文文本************
适配器模式将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类可以相互合作。
策略模式定义了一系列算法族,并封装在类中,它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,它是针对软件开发中经常遇到的一些设计问题,总结出来的一套通用的解决方案。
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
迭代器模式提供了一种方法,用于遍历集合对象中的元素,而又不暴露其内部的细节。
外观模式又叫门面模式,它提供了一个统一的(高层)接口,用来访问子系统中的一群接口,使得子系统更容易使用。
单例模式(Singleton Design Pattern)保证一个类只能有一个实例,并提供一个全局访问点。
组合模式可以将对象组合成树形结构来表示“整体-部分”的层次结构,使得客户可以用一致的方式处理个别对象和对象组合。
装饰者模式能够更灵活的,动态的给对象添加其它功能,而不需要修改任何现有的底层代码。
观察者模式(Observer Design Pattern)定义了对象之间的一对多依赖,当对象状态改变的时候,所有依赖者都会自动收到通知。
代理模式为对象提供一个代理,来控制对该对象的访问。代理模式在不改变原始类代码的情况下,通过引入代理类来给原始类附加功能。
工厂模式(Factory Design Pattern)可细分为三种,分别是简单工厂,工厂方法和抽象工厂,它们都是为了更好的创建对象。
状态模式允许对象在内部状态改变时,改变它的行为,对象看起来好像改变了它的类。
命令模式将请求封装为对象,能够支持请求的排队执行、记录日志、撤销等功能。
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。 基本介绍 **意图:**在不破坏封装性的前提下,捕获一个对象的内部状态,并在该
顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为
享元模式(Flyweight Pattern)(轻量级)(共享元素)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结