EasyUi+Spring Data 实现按条件分页查询的实例代码

Spring data 介绍

Spring data 出现目的 为了简化、统一 持久层 各种实现技术 API ,所以 spring data 提供一套标准 API 和 不同持久层整合技术实现 .

自己开发 Repository 只需要继承 JpaRepository 接口CrudRepository
save、 delete、 deteleAll、 findAll、 findOne、 count
PagingAndSortingRepository
findAll(Sort) 基于排序的查询、 findAll(Pageable) 基于分页的查询

 Spring data Query 使用 实现条件查询

第一种 根据方法命名规则自动生成

基于一列查询等值查询 findBy 列名 例如: findByName(String name);

基于一列模糊查询 findBy 列名 Like 例如: findByNameLike(String name)

基于两列等值查询 findBy 列名 And 列名 例如: findByUsernameAndPassword(String username, String password )

第二种 不按命名规则写的查询方法,可以配置@Query 绑定 JPAL 语句或者 SQL 语句

第三种 不按命名规则写的查询方法 配置@Query 没写语句 , 实体类 @NamedQuery 定义

带有条件 修改和删除操作

使用@Query 注解完成 , 搭配使用@Modifying 标记修改、删除操作

将记录 1 的 最小长度改为 15

注意:使用单体测试,测试 DAO ,要添加事务,设置事务不回滚

代码实现

1.前端页面端

//首先需要使用到表单序列化为json对象的方法
  
  //将表单序列化为json对象
    $.fn.serializeJson=function(){
      var serializeObj={};
      var array=this.serializeArray();
      var str=this.serialize();
      $(array).each(function(){
        if(serializeObj[this.name]){
          if($.isArray(serializeObj[this.name])){
            serializeObj[this.name].push(this.value);
          }else{
            serializeObj[this.name]=[serializeObj[this.name],this.value];
          }
        }else{
          serializeObj[this.name]=this.value;
        }
      });
      return serializeObj;
    };

2.获取到giid表单信息

 $(function(){

// 先将body隐藏,再显示,不会出现页面刷新效果

   $("body").css({visibility:"visible"});

  // 信息表格

     $('#grid').datagrid( {

    iconCls : 'icon-forward',

    fit : true,

    border : false,

    rownumbers : true,

    striped : true,

    pageList: [30,50,100],

    pagination : true,

    toolbar : toolbar,

    url : "../../courier_pageQuery.action",

    idField : 'id',

    columns : columns,

    onDblClickRow : doDblClickRow

    //按条件查询

   $("#searchBtn").click(function(){

     //将searchFrom表单中的数据转成json数据

      var params = $("#searchForm").serializeJson();

     //将json对象,绑定到datagrid上,完成带有条件查询的请求

    $("#grid").datagrid('load',params);

    //关闭查询窗口

     $("#searchWindow").window('close');

     });

  }); 

});

3.后台代码

action操作


@SuppressWarnings("all")

@ParentPackage("json-default")

@Namespace("/")

@Controller

@Scope("prototype")

public class CourierAction extends ActionSupport implements ModelDriven<Courier>{

  //模型驱动

  private Courier courier = new Courier();

  @Override

  public Courier getModel() {

    return courier;

  }

  //注入CourierService

  @Autowired

  private CourierService courierSerive;

  /**

   * 保存

   */

  @Action(value="curier_save",results={@Result(name="success",

      location="./pages/base/courier.html",type="redirect")})

  public String save(){

    //调用业务层

    courierSerive.save(courier);

    return SUCCESS;

  }

  //--分页查询所有取派员数据---

  //接收参数 属性驱动

  private int page;

  private int rows;

  public void setPage(int page) {

    this.page = page;

  }

  public void setRows(int rows) {

    this.rows = rows;

  }

  /**

   * 分页查询所有的信息

   */

  @Action(value="courier_pageQuery",results={@Result(name="success",type="json")})

  public String pageQuery(){

    //调用Spring的方法

    Pageable pageable = new PageRequest(page-1, rows);

    //根据查询条件,构造Specification条件查询对象

    Specification<Courier> specification = new Specification<Courier>() {

      /**

       * 构造条件查询方法,如果方法返回null 代表无条件查询

       * Root 参数 获取条件表达式 

       * CriteriaQuery 参数 构造简单查询条件返回,提供where方法

       * CriteriaBuilder 参数 构造Predicate对象,条件对象,构造复杂查询效果

       */

      @Override

      public Predicate toPredicate(Root<Courier> root, CriteriaQuery<?> query, CriteriaBuilder cb) {

        //将查询到的结果放到集合中

        List<Predicate> list = new ArrayList<Predicate>();

        //单表查询(查询当前对象对应的数据表),查询工号,等值查询

        if(StringUtils.isNotBlank(courier.getCourierNum())){

          Predicate p1 =cb.equal(root.get("courierNum").as(String.class), courier.getCourierNum());

          list.add(p1);

        }

        if(StringUtils.isNotBlank(courier.getCompany())){

          //查询所属单位,模糊查询

          Predicate p2 = cb.like(root.get("company").as(String.class), "%"+courier.getCompany()+"%");

          list.add(p2);

        }

        if(StringUtils.isNotBlank(courier.getType())){

          //查询类型,等值查询

          Predicate p3 = cb.equal(root.get("type").as(String.class),courier.getType());

          list.add(p3);

        }

        //多表查询,查询标准

        Join<Courier, Standard> standardRoot = root.join("standard",JoinType.INNER);

        if(courier.getStandard() != null && StringUtils.isNotBlank(courier.getStandard().getName())){

          //进行模糊查询

          Predicate p4 = cb.like(standardRoot.get("name").as(String.class), 

              "%"+courier.getStandard().getName()+"%");

          list.add(p4);

        }

        //new Predicate[0] 代表一个泛型,返回类型是Predicate

        return cb.and(list.toArray(new Predicate[0]));

      }

    };

    //调用业务层

    Page<Courier> pageData=courierSerive.findAll(specification,pageable);

    //压入值栈对象

    //根据查询结果封装datagrid需要的数据格式

    Map<String,Object> result = new HashMap<String,Object>();

    result.put("total", pageData.getTotalElements());

    result.put("rows", pageData.getContent());

    //压入值栈返回

    ActionContext.getContext().getValueStack().push(result);

    return SUCCESS;

  }

}

Service层操作

/**

   * 条件查询所有的快递员信息

   */

  @Override

  public Page<Courier> findAll(Specification<Courier> specification, Pageable pageable) {

    return courierRepository.findAll(specification,pageable);

  }

Dao操作,Dao接口需要继承两个接口

Spring Data 还是非常强大的,封装了hibernate的很多方法,我们可以直接拿来用

public interface CourierRepository extends JpaRepository<Courier, Integer>,

  JpaSpecificationExecutor<Courier>{

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Thinkphp搜索时首页分页和搜索页保持条件分页的方法

    本文实例讲述了Thinkphp实现搜索时首页分页和搜索页保持条件分页的方法.分享给大家供大家参考.具体实现方法如下: 在做搜索查询时突然发现在首页用的分页代码在搜索页使用时出现错误,首页分页代码(代码中标注start与end部分为分页代码) 复制代码 代码如下: public function index(){   $res=D('Info');// 实例化Data数据对象 /**********start************/   import('ORG.Util.Page');// 导入

  • SQLServer存储过程实现单条件分页

    话不多说,请看代码: SQLServer Procedure Pagination_basic: ALTER PROCEDURE [qiancheng].[Pagination_basic] ( @Table_name VARCHAR (255), --name of table @Rows_target VARCHAR (1000) = '*', --search rows @Rows_condition VARCHAR (1000) = '', --the condition to find

  • jQuery条件分页 代替离线查询(附代码)

    import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Join; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import net.sf.json.JSONOb

  • EasyUi+Spring Data 实现按条件分页查询的实例代码

    Spring data 介绍 Spring data 出现目的 为了简化.统一 持久层 各种实现技术 API ,所以 spring data 提供一套标准 API 和 不同持久层整合技术实现 . 自己开发 Repository 只需要继承 JpaRepository 接口CrudRepository save. delete. deteleAll. findAll. findOne. count PagingAndSortingRepository findAll(Sort) 基于排序的查询.

  • Spring Data JPA带条件分页查询实现原理

    最新Spring Data JPA官方参考手册 Version 2.0.0.RC2,2017-07-25 https://docs.spring.io/spring-data/jpa/docs/2.0.0.RC2/reference/html/ JPA参考手册 (找了半天, 在线版的只找到这个) https://www.objectdb.com/java/jpa Spring Data JPA的Specification类, 是按照Eric Evans的<领域驱动设计>书中Specificat

  • Spring Data + Thymeleaf 3 + Bootstrap 4 实现分页器实例代码

    实际上分页器或者分页组件在现实中都有广泛着的应用,照理来说老卫没有必要单独撰文来提这茬.事实是,我近期刚好在写一门关于Spring Data.Thymeleaf 3.Bootstrap 4 的应用课程,所以用了Bootstrap 4的样式,结果之前很多例如 Bootstrap 3 的表格.分页器啊之类的插件都不能很好的兼容,百度谷歌无果,而且 Bootstrap 4 还没有出稳定版本,官网的示例也是少的可怜,最终下决心要自己写个分页器了,所用到的技术就是 Spring Data.Thymelea

  • Spring Data JPA进行数据分页与排序的方法

    一.导读 如果一次性加载成千上万的列表数据,在网页上显示将十分的耗时,用户体验不好.所以处理较大数据查询结果展现的时候,分页查询是必不可少的.分页查询必然伴随着一定的排序规则,否则分页数据的状态很难控制,导致用户可能在不同的页看到同一条数据.那么,本文的主要内容就是给大家介绍一下,如何使用Spring Data JPA进行分页与排序. 二.实体定义 我们使用一个简单的实体定义:Article(文章) @Data @AllArgsConstructor @NoArgsConstructor @Bu

  • Spring Data Jpa的四种查询方式详解

    这篇文章主要介绍了Spring Data Jpa的四种查询方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.调用接口的方式 1.基本介绍 通过调用接口里的方法查询,需要我们自定义的接口继承Spring Data Jpa规定的接口 public interface UserDao extends JpaRepository<User, Integer>, JpaSpecificationExecutor<User> 使用这

  • 使用ElementUI写一个前端分页查询的实例

    目录 前言 前端分页 查询 写在最后 前言 一般我们在做项目的时候,都是通过调用后台接口去做增删改查,但是也有例外,有些某些特定场景下,会让前端去做好增删改查. 那么我们今天就来做一下这个需求. 使用的框架是Vue,UI框架是使用率很高的ElementUI. 那么我们开干吧. 前端分页 假定我们的数据是通过点击一个添加按钮,弹出一个添加弹窗,输入好数据后,点击确定按钮,把数据保存到表格中去. 那么就是这样的 { data () { return { page: { pageOffset: 1,

  • Oracle分页查询的实例详解

    Oracle分页查询的实例详解 1.Oracle分页查询: SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM tab) A WHERE ROWNUM <= 40 ) WHERE RN >= 21; 这个分页比下面的执行时间少,效率高. 2. select * from (select c.*,rownum rn from tab c) where rn between 21 and 40 对比这两种写法,绝大多数的情况下,第一个

  • Oracle分页查询性能优化代码详解

    对于数据库中表的数据的 Web 显示,如果没有展示顺序的需要,而且因为满足条件的记录如此之多,就不得不对数据进行分页处理.常常用户并不是对所有数据都感兴趣的,或者大部分情况下,他们只看前几页. 通常有以下两种分页技术可供选择. Select * from ( Select rownum rn,t.* from table t) Where rn>&minnum and rn<=&maxnum 或者 Select * from ( Select rownum rn,t.* fro

  • ssm实现分页查询的实例

    ssm整合实现分页查询 一.通过limit查询语句实现分页,并展示 1.mapper.xml配置 <select id="selectUsersByPage" parameterType="int" resultMap="UserMap"> SELECT * number from user limit #{page},10 </select> 查询user表,从第page项开始,每次返回10条数据 2.index.jsp

  • 基于Mybatis Plus实现多表分页查询的示例代码

    注意:Mybatis Plus 3.0.7 版本才开始用[自定义sql]+[QueryWrapper],低版本不能使用,还是老实写SQL进行条件拼接 1.源码分析 在Wrapper<T>接口中就有如下方法 /** * 获取自定义SQL 简化自定义XML复杂情况 * 使用方法:自定义sql + ${ew.customSqlSegment} * 1.逻辑删除需要自己拼接条件 (之前自定义也同样) * 2.不支持wrapper中附带实体的情况 (wrapper自带实体会更麻烦) * 3.用法 ${e

随机推荐