2016-09-21 113 views
2

我正在寫一個分頁的Oracle SQL查詢,它工作在SQL Developer的罰款,但是當我嘗試使用Spring JDBC模板,它拋出Oracle分頁查詢中的列無效?

的SQLException通過Java應用程序運行:無效的列類型

實際查詢:

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

您共享的Java代碼列表不完整,「paramSource」包含什麼? –

+0

我已添加過......請看看 –

+0

什麼是您的數據包表的表定義?你能發佈異常堆棧嗎?你可以發佈你的PacketMapper代碼嗎? – Nick

回答

0

我相信這個問題是與你的別名的特殊「__」字符的rownum speudocolumn。爲你的rownum返回列嘗試一個不同的別名,或者嘗試包括{escape'_'}包含語法。我只是簡單地改變僞列別名。

+0

Oracle可以將r__作爲列別名。試試看: select r__ from(select rownum as r__ from dual connect by rownum <= 10) –

0

你使用過NamedParameterJdbcTemplate嗎?

這樣的...

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

是的,我試過了..仍然不工作 –

0

您可以實現此查詢甲骨文:

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

PS:它只能在甲骨文12C。