2017-12-27 16 views
1

私はSpring WebアプリケーションでJPA/HibernateでリレーショナルDBにアクセスしています。私は、リレーショナル結果をJSONオブジェクトに変換する必要がある多くのAjaxクエリーを持っています。リレーショナルJPA問合せから、これまで以下のように変換する簡単なソリューションがありますか?リレーショナルDBからのJSONオブジェクトの作成JPA/Hibernateクエリ

enter image description here

あなたは日がStartTimeEndTime(行1対2)のいずれかです。この例では、リレーショナルDBは、オブジェクトごとに2列に戻ってくることがわかります結果

[ 
    { id: event-..782, color: rgba(14,48,71,0.6), startTime : 2017-12-27 00:05, endTime: 2017-12-27 00:25 }, 
    { id: event-..801, color: rgba(249,115,0,0.6), startTime: 2017-12-27 00:30, endTime: 2017-12-27 00:45 }, 
    { id: event-..776, color: rgba(255,0,0,0.99), startTime: 2017-12-27 00:00, endTime: 2017-12-27 00:05 }, 
    { id: event-..838, color: rgba(255,0,0,0.99), startTime: 2017-12-27 00:25, endTime: 2017-12-27 00:30 } 
] 

。ここでは、2行から2列に結合する必要がありました。このような例がたくさんありますが、表形式のデータを何らかの形でJSONにマッサージする必要があります。私が見

ソリューションはカスタム オブジェクトにマッサージ/プロジェクトの結果にいくつかの魔法を行い、JPA側で

  • ているが、これは非常に痛いです。ネイティブSQLのハックが可能である場合もあれば、そうでない場合もあります。これは一貫性がなく不確かなようです。
  • 「プレーン」JPAエンティティを取得した後に、javax.jsonやGSONなどのツールで手動のJSON構築を使用しますが、これは間違ったアプローチです。しかし、私がこのルートを行っても、JPAからのカスタム結果を得るためのPOJO(実際のドメインエンティティを取得しないため)と、実際の最終的なJSON表現のためのPOJOが2つ必要です。

この問題はどのように処理されますか?彼らは本当にJPA/Hibernateを微調整していますか、彼らはGSONを使ってマニュアルを作っていますか?

私たちはDBとしてPostgreSQL 10を使用しています。

+0

具体的な問題は明確ではありません。 dbが2つの結果を返すとはどういう意味ですか?コードを表示します。とにかく、dbオブジェクトを表現したり問い合わせたりするためのJPA、オブジェクトをjson表現に変換するためのjsonライブラリ。ところで、なぜあなたはrgbaの色を表現するために整数を使わないのですか? – perissf

+0

この場合、オブジェクト情報ごとに2行あります。行1はStartTime(Date val)、Row 2はEndTime(Date val)です。 –

+0

あなたのタグはあなたがSpringを使用していると言います。 Spring MVCはJacksonを使用してJSONを自動生成します:https://spring.io/guides/gs/rest-service/ –

答えて

0

あなたはSqlResultSetMappingマップされたエンティティまたは@NamedNativeQueryを使用することができます、あなたのクエリは、このようなものでなければなりませんあなたが望む形式で正確な結果を得るとJSONオブジェクトに直接マッピングするために(あなたのRDBMSに依存します) :

Select distinct id_char, color, date starTime, 
(Select date from table t2 where t2.id_char=t1.id_cgar and t2.id_int=2) as endTime 
From table t1 where t1.id_int=1 

また、あなたは、単純なPOJOクラスを使用する形式に変換されて結果を取得し、アプリケーション層にすることができます。

+0

ヒント#2では、Forループを使用して各行を順番にスキャンしてPOJOを構築することができます。つまり、同じイベントに対して、変更の有無を確認して手動でフィールドを設定しますか?これは恐ろしいことであり、手作業による処理は避けなければならないという苦情がありました。 –

+0

いいえ、もちろんですこのような操作(for-loopsを使用し、アプリケーション層でDBから得た合計結果を処理する)は、アプリケーションに使用されるメモリに悪影響を及ぼし、そのパフォーマンス – jfun

関連する問題