2016-09-21 4 views
2

私はページネーションのためのOracle SQLクエリを書いて、それは、SQL Developerのでは正常に動作しますが、私はそれがOracleのページ区切りクエリに無効な列がありますか?

のSQLExceptionスロー春JDBCテンプレートを使用してJavaアプリケーションを介して実行しようとすると:無効な列タイプ

実際のクエリ: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) 

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 '_'}インクルード構文を含めてみてください。私は単にpseudocolumnエイリアスを自分で変更したいと思います。

+0

Oracleは列エイリアスとしてr__を使用しても問題ありません。試してみてください: select r__ から(選択rownumとしてr デュアル 接続ローミン<= 10) –

0

NamedParameterJdbcTemplateを使用しましたか?このような

...

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

はい、私はそれを試しました..まだ動作しません –

0

は、Oracle、このクエリを実行することができます。

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

PS:これは、Oracle 12Cでのみ動作します。

関連する問題