解决方案 »

  1.   

    我所理解的好像没有更快的办法了...毕竟你是获取总记录数, 这个要么就是直接sql查询count,要么就是你查询的list.size()..
      

  2.   

    用count关键字,不用重新再写一句sql,直接用原有的sql只要在select *这个地方用ibatis的isEquals标签用个标识来标记是select *还是select count(1),后面的sql都可以不用改变
      

  3.   

    代码如下  怎么用自己处理下
    不用多些一个count  sql
    List<Coupons> data = activityDao.commonQueryList(
    "Activity.getCouponsList", coupons);
    Integer count = activityDao.listCount("Activity.getCouponsList",
    coupons);@SuppressWarnings("unchecked")
    public Integer listCount(String statement, Object parameter) {
    return getTotalCount(getSqlSessionTemplate(), statement, parameter);
    } /**
     * get total count
     * 
     * @param sqlSession
     * @param statementName
     * @param values
     * @return
     */
    private Integer getTotalCount(SqlSessionTemplate sqlSession,
    String statementName, Object values) {
    Map parameterMap = toParameterMap(values);
    Integer count = 0;
    try {
    MappedStatement mst = sqlSession.getSqlSessionFactory()
    .getConfiguration().getMappedStatement(statementName);
    BoundSql boundSql = mst.getBoundSql(parameterMap);
    String sql = " select count(*) total_count from ("
    + boundSql.getSql() + ") ";

    Connection con = sqlSession.getDataSource().getConnection();
    PreparedStatement pstmt = con.prepareStatement(sql);
    // BoundSql countBS = new
    // BoundSql(mst.getConfiguration(),sql,boundSql.getParameterMappings(),parameterMap);
    setParameters(pstmt, mst, boundSql, parameterMap);
    ResultSet rs = pstmt.executeQuery();
    if (rs.next()) {
    count = rs.getInt("total_count");
    }
    rs.close();
    con.close();
    pstmt.close();
    } catch (Exception e) {
    count = 0;
    e.printStackTrace();
    throw new RuntimeException(e);
    }
    return count;
    } /**
     * 对SQL参数(?)设值,参考org.apache.ibatis.executor.parameter.
     * DefaultParameterHandler
     * 
     * @param ps
     * @param mappedStatement
     * @param boundSql
     * @param parameterObject
     * @throws SQLException
     */
    private void setParameters(PreparedStatement ps,
    MappedStatement mappedStatement, BoundSql boundSql,
    Object parameterObject) throws SQLException {
    ErrorContext.instance().activity("setting parameters")
    .object(mappedStatement.getParameterMap().getId());
    List<ParameterMapping> parameterMappings = boundSql
    .getParameterMappings();
    if (parameterMappings != null) {
    Configuration configuration = mappedStatement.getConfiguration();
    TypeHandlerRegistry typeHandlerRegistry = configuration
    .getTypeHandlerRegistry();
    MetaObject metaObject = parameterObject == null ? null
    : configuration.newMetaObject(parameterObject);
    for (int i = 0; i < parameterMappings.size(); i++) {
    ParameterMapping parameterMapping = parameterMappings.get(i);
    if (parameterMapping.getMode() != ParameterMode.OUT) {
    Object value;
    String propertyName = parameterMapping.getProperty();
    PropertyTokenizer prop = new PropertyTokenizer(propertyName);
    if (parameterObject == null) {
    value = null;
    } else if (typeHandlerRegistry
    .hasTypeHandler(parameterObject.getClass())) {
    value = parameterObject;
    } else if (boundSql.hasAdditionalParameter(propertyName)) {
    value = boundSql.getAdditionalParameter(propertyName);
    } else if (propertyName
    .startsWith(ForEachSqlNode.ITEM_PREFIX)
    && boundSql.hasAdditionalParameter(prop.getName())) {
    value = boundSql.getAdditionalParameter(prop.getName());
    if (value != null) {
    value = configuration.newMetaObject(value)
    .getValue(
    propertyName.substring(prop
    .getName().length()));
    }
    } else {
    value = metaObject == null ? null : metaObject
    .getValue(propertyName);
    }
    TypeHandler typeHandler = parameterMapping.getTypeHandler();
    if (typeHandler == null) {
    throw new ExecutorException(
    "There was no TypeHandler found for parameter "
    + propertyName + " of statement "
    + mappedStatement.getId());
    }
    typeHandler.setParameter(ps, i + 1, value,
    parameterMapping.getJdbcType());
    }
    }
    }
    } protected Map toParameterMap(Object parameter) {
    if (parameter == null) {
    return new HashMap();
    }
    if (parameter instanceof Map) {
    return (Map<?, ?>) parameter;
    } else {
    try {
    return PropertyUtils.describe(parameter);
    } catch (Exception e) {
    e.printStackTrace();
    return null;
    }
    }
    }
      

  4.   

    在xml里面写好count方法吧 这样简单省事
      

  5.   


    这样每个查询语句都要增加COUNT的SELECT,个人感觉不是很好