使用JdbcTemplate获取从查询返回的行数

时间:2017-11-24 15:20:11

标签: java mysql jdbc

我有一个看似简单的问题,但无法弄清楚或在网上找到解决方案。我正在做的是编写一个DAO方法来获取帐户下的用户。我包含参数来过滤和命令我的查询。涉及到不同的表,我的查询使用内部联接,左外部联接...。并不重要。重要的是,我想知道我的查询返回了多少行,即使在限制之后(总数不受限制)。这是我方法中的一些代码..

        List<User> users = new ArrayList<User>();

        UserRowCallbackHandler userHandler = new UserRowCallbackHandler(accountId);

        String query = null;

        if (limit == -1) {
            query = String.format("%s\nORDER BY %s",
                    sqlXml.getQuery("GET_USERS_BY_ACCOUNT_ID"),
                    orderBy);
        } else {
            query = String.format("%s\nORDER BY %s \nLIMIT %d, %d\n",
                    sqlXml.getQuery("GET_USERS_BY_ACCOUNT_ID"),
                    orderBy, offset, limit);
        }


        getJdbcTemplate().query(
                query, userHandler,
                accountId, filter);

        users.addAll(userHandler.getUsers());

我可以添加到查询中(或者如何利用我的JbdcTemplate对象)查看查询返回的总行数,即使在限制后也是如此

1 个答案:

答案 0 :(得分:0)

好的,我对我的解决方案不是很满意,但它现在有效。答案是我将不得不运行3个查询,我想这不是一个问题,但我希望只运行一个查询。

答案是运行初始查询(没有限制)并在之后立即运行第二个查询(SELECT FOUND_ROWS())。然后运行指定限制的第3个查询。我想如果没有指定限制我只需要运行两个查询,但我使用它来进行服务器端分页,所以几乎总会有一个限制。这是代码

        UserRowCallbackHandler userHandler = new UserRowCallbackHandler(accountId);

        query = String.format("%s\nORDER BY %s",
                sqlXml.getQuery("GET_USERS_BY_ACCOUNT_ID"),
                orderBy);

        queryForTotal = "SELECT FOUND_ROWS()";

        getJdbcTemplate().query(
                query,
                userHandler, accountId, filter);

        filteredTotal = getJdbcTemplate().queryForInt(queryForTotal);

        if (limit != -1) {
            // re-initialize handler for clean data
            userHandler = new UserRowCallbackHandler(accountId);

            query = String.format("%s\nORDER BY %s \nLIMIT %d, %d\n",
                    sqlXml.getQuery("GET_USERS_BY_ACCOUNT_ID"),
                    orderBy, offset, limit);


            getJdbcTemplate().query(
                    query,
                    userHandler, accountId, filter);
        }