哥们,虽然我没试过查询时负数的情况,但我觉得这个应该是hibernate最一些手工录入错误的屏蔽。可能是这么设计的,-1,就按照第一页去查,-3就按照第三页去查,这个需要弄的只是在hibernate框架上增加一层判断。我记得以前单独用mysql的limit查询的时候,负数会报错,不知道现在升级后的mysql是否屏蔽了这个问题。

解决方案 »

  1.   


    org.hibernate.internal.AbstractQueryImpl 这个类里面
    public Query setFirstResult(int firstResult) {
    selection.setFirstRow( firstResult);
    return this;
    } public Query setMaxResults(int maxResults) {
    if ( maxResults < 0 ) {
    // treat negatives specically as meaning no limit...
    selection.setMaxRows( null );
    }
    else {
    selection.setMaxRows( maxResults);
    }
    return this;
    }这个类里面org.hibernate.engine.spi.RowSelectionpublic boolean definesLimits() {
    return maxRows != null ||
               ( firstRow != null && firstRow.intValue() <= 0 );
    }最终在这个org.hibernate.engine.query.spi.HQLQueryPlan源码里面方法performList()得到体现boolean hasLimit = queryParameters.getRowSelection() != null &&
                       queryParameters.getRowSelection().definesLimits();
    boolean needsLimit = hasLimit && translators.length > 1;
    QueryParameters queryParametersToUse;
    if ( needsLimit ) {
    LOG.needsLimit();
    RowSelection selection = new RowSelection();
    selection.setFetchSize( queryParameters.getRowSelection().getFetchSize() );
    selection.setTimeout( queryParameters.getRowSelection().getTimeout() );
    queryParametersToUse = queryParameters.createCopyUsing( selection );
    }
    else {
    queryParametersToUse = queryParameters;
    }大概意思就是index或page只要有一个为null或为负数,表示就查找全部
    我这里hibernate是4.X的