【问题标题】:Invalid Column in a Oracle Pagination query?Oracle 分页查询中的列无效?
【发布时间】:2016-09-21 16:21:27
【问题描述】:

我正在编写一个用于分页的 Oracle SQL 查询,它在 sql developer 中运行良好,但是当我尝试使用 Spring JDBC 模板运行 java 应用程序时,它会抛出

SQLException: 列类型无效

实际查询:

SELECT * 
FROM (
    SELECT a.*, rownum r__ 
    FROM ( 
       SELECT * 
       FROM Packet 
       ORDER BY packet_date_created DESC 
    ) a 
    WHERE rownum < ((pageNumber*pageSize)+1) 
)
WHERE r__ >= (((pageNumber-1)* pageSize)+1)

在 Java 中:

MapSQlParameterSource paramSource = new MapSQlParameterSource ()
paramSource.addValue("pageNumber", pageNumber.intValue())
paramSource.addValue("pageSize", pageSize.intValue())

String sqlString = 
   "SELECT * FROM (SELECT a.*, rownum r__ FROM ( SELECT  FROM packet ORDER BY packet_date_created DESC ) a  " +
   "WHERE rownum < ((:pageNumber * :pageSize) + 1 )) " +
   "WHERE r__ >= (((:pageNumber-1) * :pageSize) + 1)";
List<PacketDTO> packetDTOList = jdbcTemplate.query(sqlString, paramSource, new PacketMapper());

非常感谢您提出任何建议。

【问题讨论】:

  • 您分享的 Java 代码清单不完整,paramSource 包含什么?
  • 我已经添加了..请看一下
  • 你的包表的表定义是什么?您可以发布异常堆栈吗?你能发布你的 PacketMapper 代码吗?
  • 您使用的是什么版本的 Oracle JDBC 驱动程序?
  • 查看您的映射器并确保驱动程序支持您使用的所有 getXXX。

标签: sql oracle jdbc spring-jdbc


【解决方案1】:

我认为问题出在 rownum 伪列的别名的特殊“__”字符上。为您的 rownum 返回列尝试不同的别名,或尝试包含 {escape '_'} 包含语法。我只是自己更改伪列别名。

【讨论】:

  • Oracle 可以使用 r__ 作为列别名。尝试:select r__ from (select rownum as r__ from dual connect by rownum
【解决方案2】:

你用过NamedParameterJdbcTemplate吗?

像这样……

<bean class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
 <constructor-arg ref="dataSource" />
</bean>

【讨论】:

    【解决方案3】:

    您可以在 Oracle 中实现这个查询:

    SELECT * 
           FROM Packet 
           ORDER BY packet_date_created DESC
    OFFSET :v_offset ROWS FETCH NEXT :v_CountNextRows ROWS ONLY;
    

    PS:它仅适用于 Oracle 12C。

    【讨论】:

      猜你喜欢
      • 2017-03-29
      • 2019-05-31
      • 2011-08-27
      • 1970-01-01
      • 2019-11-23
      • 1970-01-01
      • 1970-01-01
      • 2015-06-07
      • 1970-01-01
      相关资源
      最近更新 更多