我正在编写用于分页的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());
任何建议都会非常感激。
答案 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。