首页 > 解决方案 > SQL - 在 DAO 中执行时列名无效

问题描述

我正在对我的 Spring 应用程序进行查询,它将根据此查询在我的数据库中选择数据:

SELECT * FROM
    (
        SELECT a.*, rownum r__
        FROM
        (
            SELECT * FROM SUBSCRIPTIONS WHERE status = 'active' and is_blocked = 'N'
        ) a
        WHERE rownum < ((1 * 3) + 1 )
    )
WHERE r__ >= (((1-1) * pageSize) + 1)

目标是简单地对结果进行分页。

当我在我的数据库查询窗口上执行代码时,我得到了预期的结果,但是当我通常在 java 代码中直接执行时,我得到了这个错误:

引起:org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; 错误的 SQL 语法 [SELECT * FROM( SELECT a.*, rownum r__ FROM ( SELECT * FROM SUBSCRIPTIONS WHERE status = 'active' and is_blocked = 'N' ) a WHERE rownum < ((? * ?) + 1 ))WHERE r__ >= (((?-1) * ?) + 1)]; 嵌套异常是 java.sql.SQLException: Invalid column name

我不明白为什么会返回此错误,因为我的查询在 Oracle SQL 客户端上执行时有效...

要执行我的查询,我这样做:

MapSqlParameterSource params = new MapSqlParameterSource();
        params.addValue("pageSize", paging.getItemsPerPage());
        params.addValue("pageNumber", paging.getPageToFetch());
        SqlQueryLogger.logDebugSqlQuery(selectActiveAndUnblockedSubscriptionPaged, params, log);

        List<Subscription> subscriptions = getNamedParameterJdbcTemplate().query(selectActiveAndUnblockedSubscriptionPaged, params, new SubscriptionRowMapper());
        SubscriptionPagingResult subscriptionPagingResult = new SubscriptionPagingResult();
        subscriptionPagingResult.setResult(subscriptions);

selectActiveAndUnblockedSubscriptionPaged 变量是:

"SELECT * FROM" +
            "(" +
            "    SELECT a.*, rownum r__" +
            "    FROM" +
            "    (" +
            "        SELECT * FROM SUBSCRIPTIONS WHERE status = 'active' and is_blocked = 'N'" +
            "    ) a" +
            "    WHERE rownum < ((:pageNumber * :pageSize) + 1 )" +
            ")" +
            "WHERE r__ >= (((:pageNumber-1) * :pageSize) + 1)";

有谁知道为什么这段代码不起作用?谢谢

标签: javaspringoracleplsqlspring-jdbc

解决方案


只是一个建议,您在 thr main from () 之后错过了表别名

SELECT t.* FROM
(
    SELECT a.*, a.rownum r__
    FROM
    (
        SELECT * 
        FROM SUBSCRIPTIONS 
        WHERE status = 'active' 
        and is_blocked = 'N'
    ) a
    WHERE a.rownum < ((1 * 3) + 1 )
) t 
WHERE t.r__ >= (((1-1) * t.pageSize) + 1)

推荐阅读