Oracle分页查询中的列无效?

时间:2016-09-21 16:21:28

标签: sql oracle jdbc spring-jdbc

我正在编写用于分页的Oracle SQL查询,它在sql开发人员中工作正常但是当我尝试使用Spring JDBC Template运行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());

任何建议都会非常感激。

3 个答案:

答案 0 :(得分:0)

我认为问题在于特殊的&#34; __&#34; rownum speudocolumn的别名字符。为rownum返回列尝试不同的别名,或尝试包含{escape&#39; _&#39;}包含语法。我自己只是改变伪列别名。

答案 1 :(得分:0)

您使用过NamedParameterJdbcTemplate吗?

像这样......

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

答案 2 :(得分:0)

您可以实现此查询Oracle:

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

PS:它仅适用于Oracle 12C。