SQL - 在 DAO 中执行时列名无效
Posted
技术标签:
【中文标题】SQL - 在 DAO 中执行时列名无效【英文标题】:SQL - Invalid column name when executing in DAO 【发布时间】:2019-02-02 09:50:44 【问题描述】:我正在对我的 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' ) 一个 WHERE rownum = (((?-1) * ?) + 1)];嵌套异常是 java.sql.SQLException:列名无效
我不明白为什么会返回此错误,因为我的查询在 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)";
有谁知道为什么这段代码不起作用? 谢谢
【问题讨论】:
错误消息非常简单,因此可以通过将*
替换为来自 SUBSCRIPTIONS
的实际列名来开始查找无效的列名,一次可能有几个。当然检查r__
,也许这是一个开始。
当我在查询中将 * 替换为列名时,出现了一个新错误:在第二次选择中突出显示 a.* 的不明确的列定义。你有想法吗 ?谢谢!
确切的错误是这个:ORA-00918: column ambiguously defined
我打算写下下面答案中提到的缺少的别名,但忘记了。也许从那里开始看看它是否有帮助
什么是 PL/SQL 客户端?我没有看到任何 PL/SQL,只有 SQL。
【参考方案1】:
只是建议您在 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)
【讨论】:
谢谢。不幸的是,这不是错误,但我添加了忘记的别名,它更好:-) @DupuisDavid 回答已更新为所有涉及的列添加表别名..但请确保您的订阅表中也没有 rownum 列以上是关于SQL - 在 DAO 中执行时列名无效的主要内容,如果未能解决你的问题,请参考以下文章