2017-02-03 4 views
2

各行は、この地図を返すようにRowMapperのを使用して<文字列、地図<文字列、リスト<Object> >>

School Class StudentID Name Age 
123  8  811  John 10 
123  8  812  Smith 11 
123  8  821  John 12 
123  8  822  Smith 13 
123  9  911  John 14 
123  9  912  Smith 15 
456  8  811  John 10 
456  8  812  Smith 11 

ようになるだろう今私はこの

のような上記のデータを返すようにしたいです
Map<String,Map<String,List<Object>>> 

ie. Map<School,Map<Class,List<StudentID>>> 

私はRowMapperで春のJdbcTemplateを使用していますが、私が得ることのできるのはすべての行のリストです。私はRowMapperでメインマップを維持することができないので(RowMapperクラス内に静的なマップを置くことができますか?これはwebserviceであり、後続の呼び出しが不正になる可能性があるので静的にしたくありません))私は、この行のリストを取得し、私が望むコレクションを作成するロジックを持っているだけです。

私はResultSetExtractorについて知りましたが、これを使用してこれを行う方法を見つけることができませんでした。

行マッパーや何らかの並べ替えを使用してこれを行う方法がある場合は、教えてください。または、これを解決する私の唯一の方法は、リストをもう一度繰り返し、私が望むものを得ることです。

EDIT: 私のクエリは、このような選択クエリです:

SELECT * from TABLENAME 

、それが実際にJavaからResultSetを取得するために40分かかります。

CRONを使用して実行されるキャッシュオブジェクトをDB呼び出しで満たすためのものです。実際のREST呼び出しから40分遅れても問題ありません。キャッシュオブジェクトを参照します。しかし、私はできるだけ効率的にこれをやりたい。

また、このシナリオを処理できる方法が他にもある場合はお知らせください。すべてのREST呼び出しに対する通常のjdbc呼び出しは、1秒あたり100件の要求を取得するため、コストがかかります。

+0

私はあなたのエンティティのそれぞれについて、 'DAO'クラスを持っていると仮定?あなたのDAOが 'List'の' Map'への変換を行い、それを外の世界に戻すのはなぜでしょうか? – CKing

+0

jdbcTemplateの呼び出しはDAOの中にあり、RowMapperを使用してこれを行うことができるかどうかを知りたいと思います。 – v1shnu

+0

基本的に、 'JdbcTemplate'が' Map'を作成してそれを使ってクエリを実行したいのですか?私はあなたが実装するソリューションは、最終的に 'List'を内部的に' Map'に変換することになると思いますので、 'DAO'にそれをさせてみませんか? – CKing

答えて

1

あなたが実装できる

RowMapperの状態フルRowMapperあなたの問題を解決するが、それは本当にのJavaDocに記載されたステートレスなどで再利用可能であると考えられているRowMapperの考え方に準拠されていません。

... RowMapperのオブジェクトは通常、ステートレスので、再利用可能な...

RowMapperがされ行とオブジェクトの変換に使用されます。つまり、ResultSetの各行には、オブジェクトが得られます。

ResultSetExtractorは

それは本当にあなたのタスクに合うResultSetExtractorです。 ResultSetExtractorは、意図したとおりにResultSetに変換されます。

だけのResultSetを繰り返すことによってそこに地図を埋め込む実装し、あなたのJdbcTemplate.query(...)コールにResultSetExtractor実装のインスタンスを渡します。


アップデート2017年2月9日

ResultSetExtractorを使用した例が有用であろうというコメントを以下の間、私はRowCallbackHandlerインターフェースにつまずきました。両方のオプションで希望の動作を実現できますが、RowCallbackHandlerResultSetの繰り返しを処理します。 JdbcTemplate.query(...)コールでも使用できます。 RowCallbackHandlerResultSetExtractor両方の例については

私は、次の資料ラムサティシュをお勧めします。http://www.javarticles.com//2015/02/example-of-spring-callbacks-used-in-jdbctemplate.html

+0

ありがとうございます。しかし、jdbcコールを効率よく実行した直後に実際のマップを構築していますか? (パフォーマンスは良いです)。私が使っている 'SELECT * from TABLE'というクエリは、実際には40分かかります。また、マップを再構築したい場合は、ResultSetを再度反復処理する必要があります。そのため、このアプローチがパフォーマンスに役立つと考えられた理由です。 – v1shnu

+1

今日私はResultSetExtractorを試して、やりたいことをすることができました。回答が他の人にとってより有用になるように、ResultSetExtractorがどのように機能するかについての小さな実装スニペットを追加できますか? – v1shnu

関連する問題