GithubHelp home page GithubHelp logo

mybatis-paginator's Introduction

Support Mybatis version >= 3.1

Basic usage --> here

Plugin config --> here

Use in Spring+Mybatis --> spring-mybaits-template

BTW: 中文文档

Downloading from the Maven central repository

<dependencies>
  ...
    <dependency>
        <groupId>com.github.miemiedev</groupId>
        <artifactId>mybatis-paginator</artifactId>
        <version>1.2.17</version>
    </dependency>
 ...
</dependencies>

Thanks for rapid-framework and plum author.

mybatis-paginator's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mybatis-paginator's Issues

如果排序的是关键字,怎么办

数据库Mysql,
比如order by key asc,是报错的,因为key是关键字;
这时候要修改为order by key asc;尝试修改代码写成:
new PageBounds(Order.formString("key.asc"))
但会报错,因为Order类中INJECTION_REGEX正则定义没有包含“`”;
private static String INJECTION_REGEX = "[A-Za-z0-9_-+.]+";

是否可以加上解决这个问题,谢谢!

Oracle分页问题

请问这段代码这样实现的意义?
if (offset > 0) {
pagingSelect.append("select * from ( select row_.*, rownum rownum_ from ( ");
}
else {
pagingSelect.append("select * from ( ");
}
现在出现的问题是:由于第一次第二次分页查询SQL不一样,出现分页不正确的问题,检查发现rownum错乱,如果把SQL追加order by 则可以解决这个问题,不加的情况下会出现这个问题,目前遇到的是多表查询。

参数实体类里有数组会报错.版本1.2.17

Mapper类:

List selectByConditionPaged(ContentSearchVo contentSearchVo, PageBounds pageBounds);

也就是说, 当参数实体内存有数组时, 会报错,异常栈:

Error querying database. Cause: java.lang.reflect.UndeclaredThrowableException

Cause: java.lang.reflect.UndeclaredThrowableException] with root cause

org.apache.ibatis.reflection.ReflectionException: There is no getter for property named '__frch_item_0' in 'class com.itmuch.icms.content.vo.ContentSearchVo'
at org.apache.ibatis.reflection.Reflector.getGetInvoker(Reflector.java:377)
at org.apache.ibatis.reflection.MetaClass.getGetInvoker(MetaClass.java:167)
at org.apache.ibatis.reflection.wrapper.BeanWrapper.getBeanProperty(BeanWrapper.java:149)
at org.apache.ibatis.reflection.wrapper.BeanWrapper.get(BeanWrapper.java:45)
at com.github.miemiedev.mybatis.paginator.dialect.Dialect.init(Dialect.java:65)
at com.github.miemiedev.mybatis.paginator.dialect.Dialect.(Dialect.java:42)
at com.github.miemiedev.mybatis.paginator.dialect.MySQLDialect.(MySQLDialect.java:13)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at com.github.miemiedev.mybatis.paginator.OffsetLimitInterceptor.intercept(OffsetLimitInterceptor.java:73)
at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:57)
at com.sun.proxy.$Proxy47.query(Unknown Source)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:104)

问题定位在: com.github.miemiedev.mybatis.paginator.dialect.Dialect类里面的:
pageParameters.put(parameterMapping.getProperty(),wrapper.get(prop));这行;
wrapper.get(prop)会抛出异常.

如果改成pageParameters.put(parameterMapping.getProperty(),parameterObject);就正常了.

请问这是不是该版本的BUG?

SpringMVC4.x @RequestBody解析不了PageBounds对象

前台传递inputData对象
var inputData = {}; inputData.page = filter.PageIndex; inputData.limit = filter.PageLen; inputData.orders = [{property:filter.PageSorder}];
后台@requestbody PageBounds pageBounds的时候 加上orders的时候就解析不了,只有page跟limit是可以的

为保持命名的规范,建议重构部分命名

首先,感谢您提供的这个方便的分页插件;

在使用中发现命名的不规范会造成理解上的困惑(甚至让新手养成坏习惯,就像 jqGrid中默认的分页信息的命名就比较乱,我们配置了自己映射),进行了如下的命名规范(页面 jqGrid , 后台 分页等):

domain.Order => domain.OrderItem

domain.PageBounds => domain.PageBounds {
page => pageNumber,
limit => pageSize,
orders => orderItems

}

domain.PageList => domain.PagedList

domain.Paginator => domain.Paginator {
page => pageNumber,
limit => pageSize,
isHasPrePage => hasPrePage,
isHasNextPage => hasNextPage,
computePageNo => computePageNumber

}

PageListJsonMapper => PagedListJsonMapper

PageListJsonSerializer => PagedListJsonSerializer

PageListAttrHandlerInterceptor => PagedListAttrHandlerInterceptor

"PageListJSONModule" => "PagedListJsonModule"

关于软件分层的问题。

hi,最近在关注paginator,发现一个设计上的问题。插件本身提供了Order.fromString的方法去构造排序的字段,但是,调用这种方法是在controller中的,这样就需要把数据库的表结构的字段名称暴露给HTTP接口的调用方。
例如,我的pojo中,字段名称是A,对应的数据库字段可能叫做DB_A,但是如果要排序的话,接口调用者要传DB_A,DESC过来。这样似乎违背了软件分层的实践,请问有什么好的办法可以解决不。

ClassCastException On Junit test

In Junit test below code return ClassCastException

List list = (PageList) list

Detail :
java.lang.ClassCastException: java.util.ArrayList cannot be cast to com.github.miemiedev.mybatis.paginator.domain.PageList

PageBounds 好像对foreach的支持太好

《!--这样写 好像PageBounds没有起任何作用-->
select startTime,subject,ofuserext.nickname as owner, endTime,huijianroomid as huiJianRoomId from webConference,ofuserext where isdeleted=0 and huijianroomid in #{id,jdbcType=INTEGER} and endTime NOW() and ofuserext.username=webConference.owner order by endTime desc

但是,我这么写就没有问题了,PageBounds正常:
select startTime,subject,ofuserext.nickname as owner, endTime,huijianroomid as huiJianRoomId from webConference,ofuserext where isdeleted=0 and huijianroomid in (1,2) and endTime NOW() and ofuserext.username=webConference.owner order by endTime desc
上面foreach的实际结果值就是(1,2)

多张主表分页有局限性

image

多个模块或主表分页,只能从sql 那去查询,一次性查询查完,才能分页。这样在后期的开发中非常麻烦的,不具有扩展性。

oracle取区间数据

目前在使用中发现oracle取区间的数据存在问题。

`package com.github.miemiedev.mybatis.paginator.domain;

import com.github.miemiedev.mybatis.paginator.domain.Order;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.ibatis.session.RowBounds;

public class PageBounds extends RowBounds implements Serializable {
private static final long serialVersionUID = -6414350656252331011L;
public static final int NO_PAGE = 1;
protected int page;
protected int limit;
protected List orders;
protected boolean containsTotalCount;
protected Boolean asyncTotalCount;

public PageBounds() {
    this.page = 1;
    this.limit = 2147483647;
    this.orders = new ArrayList();
    this.containsTotalCount = false;
}

public PageBounds(RowBounds rowBounds) {
    this.page = 1;
    this.limit = 2147483647;
    this.orders = new ArrayList();
    if(rowBounds instanceof PageBounds) {
        PageBounds pageBounds = (PageBounds)rowBounds;
        this.page = pageBounds.page;
        this.limit = pageBounds.limit;
        this.orders = pageBounds.orders;
        this.containsTotalCount = pageBounds.containsTotalCount;
        this.asyncTotalCount = pageBounds.asyncTotalCount;
    } else {
        this.page = rowBounds.getOffset() / rowBounds.getLimit() + 1;
        this.limit = rowBounds.getLimit();
    }

}

public PageBounds(int limit) {
    this.page = 1;
    this.limit = 2147483647;
    this.orders = new ArrayList();
    this.limit = limit;
    this.containsTotalCount = false;
}

public PageBounds(int page, int limit) {
    this(page, limit, new ArrayList(), true);
}

public PageBounds(int page, int limit, boolean containsTotalCount) {
    this(page, limit, new ArrayList(), containsTotalCount);
}

public PageBounds(List<Order> orders) {
    this(1, 2147483647, orders, false);
}

public PageBounds(Order... order) {
    this(1, 2147483647, (Order[])order);
    this.containsTotalCount = false;
}

public PageBounds(int page, int limit, Order... order) {
    this(page, limit, Arrays.asList(order), true);
}

public PageBounds(int page, int limit, List<Order> orders) {
    this(page, limit, orders, true);
}

public PageBounds(int page, int limit, List<Order> orders, boolean containsTotalCount) {
    this.page = 1;
    this.limit = 2147483647;
    this.orders = new ArrayList();
    this.page = page;
    this.limit = limit;
    this.orders = orders;
    this.containsTotalCount = containsTotalCount;
}

public int getPage() {
    return this.page;
}

public void setPage(int page) {
    this.page = page;
}

public int getLimit() {
    return this.limit;
}

public void setLimit(int limit) {
    this.limit = limit;
}

public boolean isContainsTotalCount() {
    return this.containsTotalCount;
}

public void setContainsTotalCount(boolean containsTotalCount) {
    this.containsTotalCount = containsTotalCount;
}

public List<Order> getOrders() {
    return this.orders;
}

public void setOrders(List<Order> orders) {
    this.orders = orders;
}

public Boolean getAsyncTotalCount() {
    return this.asyncTotalCount;
}

public void setAsyncTotalCount(Boolean asyncTotalCount) {
    this.asyncTotalCount = asyncTotalCount;
}

public int getOffset() {
    return this.page >= 1?(this.page - 1) * this.limit:0;
}

public String toString() {
    StringBuilder sb = new StringBuilder("PageBounds{");
    sb.append("page=").append(this.page);
    sb.append(", limit=").append(this.limit);
    sb.append(", orders=").append(this.orders);
    sb.append(", containsTotalCount=").append(this.containsTotalCount);
    sb.append(", asyncTotalCount=").append(this.asyncTotalCount);
    sb.append('}');
    return sb.toString();
}

}`

在PageBounds文件中使用PageBounds(int page, int limit)函数,查询返回的数据存在问题。
如下:假如要查询3到9页的数据,每页10条数据,是否是这样设置?
PageBounds pageBounds = new PageBounds(page, pagesize * (endPage - page + 1));
这样的结果区间是对的,但是开始的数据不是从page开始的,而是从page * pagesize 开始。
打印如下:
where rownum_ <= ? and rownum_ > ?
2016-08-09 18:58:37,003 [http-apr-8086-exec-8] DEBUG [com.whatled.queryTest] - ==> Parameters: 210(Integer), 140(Integer)
18:58:37,003 DEBUG queryTest:139 - ==> Parameters: 210(Integer), 140(Integer)
2016-08-09 18:58:37,041 [http-apr-8086-exec-8] DEBUG [com.whatled.queryTest] - <== Total: 70
18:58:37,041 DEBUG queryTest:139 - <== Total: 70

源码如下:
private static final long serialVersionUID = -6414350656252331011L;
public final static int NO_PAGE = 1;
/** 页号 /
protected int page = NO_PAGE;
/
* 分页大小 /
protected int limit = NO_ROW_LIMIT;
/
* 分页排序信息 /
protected List orders = new ArrayList();
/
* 结果集是否包含TotalCount */
protected boolean containsTotalCount;

protected Boolean asyncTotalCount;

public PageBounds(){
    containsTotalCount = false;
}

public PageBounds(RowBounds rowBounds) {
    if(rowBounds instanceof PageBounds){
        PageBounds pageBounds = (PageBounds)rowBounds;
        this.page = pageBounds.page;
        this.limit = pageBounds.limit;
        this.orders = pageBounds.orders;
        this.containsTotalCount = pageBounds.containsTotalCount;
        this.asyncTotalCount = pageBounds.asyncTotalCount;
    }else{
        this.page = (rowBounds.getOffset()/rowBounds.getLimit())+1;
        this.limit = rowBounds.getLimit();
    }

}

正常的查询了70条数据,但是看请求参数Parameters: 210(Integer), 140(Integer),请求到的数据是从第14页开始的(140 / 10),长度为70,所以到210条结束。
问题在PageBounds(int page, int limit)函数,如何修改可以让请求的参数为20-90共70条。


由于这个函数只返回一页内容。page为页号,limit为分页大小,那么3到9页就是从大于第二页也就是从(page - 1) * limit 开始,对应((3 - 1) * 10)于20,但是这里设置了limit为70,所以就得到了140了。
因此这一页的数据就从140到210了。

现在想增加这样一个函数
public PageBounds(int page, int endPage, int limit)
page为当前页,endpage为结束页,查询这个区间的数据。

由于这个区间的数据不分页,当成一页,那么这里就把limit变成了区间的数量。
需要调整当前页的参数即可查询出相应区间的值。
(这里不能用page * limit,而是要把page * pagesize)
那么这个功能就可以实现了。

非常感谢作者的插件,谢谢。

使用分页插件,ognl取值为null。

很喜欢这个插件,贼干净清爽简单。希望大哥修复下这个BUG。

mapper 形参

image

image

使用插件

1,mapper
image
2,"user.type != null" 判断正确,加载了动态SQL
image
3,但是 #{user.type} 取值为null
image

删除插件后可以正常读取到值

image
image

获取总记录数出问题

使用版本:1.2.15
我使用mybatis-paginator,定义一个list()方法完成数据查询的功能,第一次查询的结果和总记录数都没有问题,当我界面中删除其中一条记录的时候,然后再次执行list()方法刷新数据的时候,把数据集合转换成PageList的时候,通过pageList.getPaginator().getTotalCount() 的总记录数还是未删除前的总记录数,相当于删除一条记录,pageList.getPaginator().getTotalCount() 的值总是第一次请求时候的值,一直没有改变? 无论是我执行删除还是增加操作都无法改变总记录数,仅搜索结果的总记录数是ok,而这些方法执行的都是同样的代码。

java.util.ConcurrentModificationException

java.util.ConcurrentModificationException
at java.util.LinkedHashMap$LinkedHashIterator.nextEntry(LinkedHashMap.java:394)
at java.util.LinkedHashMap$EntryIterator.next(LinkedHashMap.java:413)
at java.util.LinkedHashMap$EntryIterator.next(LinkedHashMap.java:412)
at com.github.miemiedev.mybatis.paginator.springmvc.PageListAttrHandlerInterceptor.postHandle(PageListAttrHandlerInterceptor.java:37)

=========================>

for(Map.Entry<String, Object> item : model.entrySet()){
Object attr = item.getValue();
if(attr instanceof PageList){
PageList pageList = (PageList)attr;
//原属性加后缀 ****** bug code
modelAndView.addObject(item.getKey()+"Paginator", pageList.getPaginator());
}
}

希望使用spring-data-common中的分页组件

spring-data-jpa , spring-data-redis等项目中均依赖于spring-data-common中提供的分页组件
对分页的一些抽象,比如Pageable , Page等都已经十分完善,
建议用spring-data-common中的分页组件,替换自己的分页实现

你好,你的组件真好。

你好,你的组件真棒,不过我使用的时候发现个问题。我使用sqlserver2008,做分页时,页面大小设为20,当前页传1时候正常,从2开始,返回的结果集大小会变成21,看了下数据,他会把上次分页结果的最后一条也传过来,所以会变成21条。看了一下源代码,SQLServer2005Dialect类的getLimitString方法中,SELECT * FROM query WHERE row_number BETWEEN ? AND ?这段代码造成的。改成
SELECT * FROM query WHERE row_number > ? AND row_number <= ?就正常了。

关于count总数不正确的问题

列表中,当添加一条新进来后,总数不变,要过一段时间再查下总数才会变为正确的,请问下是我配置的问题,还是插件本身的问题?

给大神反应几个使用过程中发现的问题?

经真实项目使用,发现一下问题。
DB2数据库分页插件解析SQL的时候遇到with开头的递归SQL语句,报错,看了一下代码没有考虑到with开头的情况。
DB2数据库分页sql语句中,如果嵌套了 order by(多个order by) ,db2分页代码中判断order by代码为
int orderByIndex = sql.toLowerCase().indexOf("order by");会有问题。

Paginator.generateLinkPageNumbers计算中间页有问题

测试条件:

  • currentPageNumber=4
  • lastPageNumber=20
  • count=5

得到的结果是:[1,2,3,4,5,6],实际应该是[2,3,4,5,6]

经检查发现:

if (endPageNumber - startPageNumber < count) {
    startPageNumber = endPageNumber - count;
    if (startPageNumber <= 0) {
        startPageNumber = 1;
    }
}

if判断有问题.
startPageNumber,endPageNumber都是已经包含进了,所以相减的时候应该+1,这样才能保证中间页<count

ArrayList 强转 PageList 失败

尊敬的作者

在执行强转类型的时候出错了,请问该如何处理?

java.util.ArrayList cannot be cast to com.github.miemiedev.mybatis.paginator.domain.PageList

仔细阅读DEMO之后找到原因 , 由于使用了错误的构造函数

new PageBounds();//默认构造函数不提供分页,返回ArrayList
new PageBounds(int limit);//取TOPN操作,返回ArrayList
new PageBounds(Order... order);//只排序不分页,返回ArrayList

new PageBounds(int page, int limit);//默认分页,返回PageList
new PageBounds(int page, int limit, Order... order);//分页加排序,返回PageList
new PageBounds(int page, int limit, List<Order> orders, boolean containsTotalCount);//使用containsTotalCount来决定查不查询totalCount,即返回ArrayList还是PageList

无法获取到总数量

在sql 里面用 foreach 标签 遍历集合 并将结果作为 IN ( )的参数
当查询数据库时数据有返回 但是 总数量和当前页没有返回 , 两个都是 0
大神,帮忙看一下
谢谢了

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.