2017-05-29 15 views
3

いくつかのサービスを移行しています。ネイティブクエリを使用してデータを取得した古いアプリケーションで、いくつかの問題を見つけて解決する最善の方法について議論したいと思います。JPAでUNIONを使用するクエリを取得する

主な問題は、このサービスでは、UNIONステートメントで接続されている他のいくつかのクエリを囲むネイティブクエリを使用することです。このような何か:

WITH TMP_QUERY AS (
select p.id,p.name from PROCESS p inner join TABLE_B on ... 
UNION 
select p.id,p.name from PROCESS p inner join TABLE_C on ... 
UNION 
select p.id,p.name from PROCESS p inner join TABLE_A on ...) 
select p.name from PROCESS p inner join TMP_QUERY tmp on p.id = tmp.id order 
by 1 

そしてJPAUNION文をサポートしていませんので、私が考えた唯一の解決策は、個別にこれらのクエリを実行して、Javaコード内の重複除去、発注や改ページを行うことです。

結果をセットに追加して、重複を削除し、Comparatorを適用して返されたエンティティを注文することがあります。しかし、もう1つの問題は、これらのクエリのいずれかが10秒から1000秒の結果からサーバータイムアウトの問題につながる可能性があるため、ページネーションも必要であるということです。

誰かが同様のことをしたことがありますか?

+0

ます場合は、 'UNION'sと離れて行うことができますように見えます'外部からのセルフジョインを使用する' SELECT ... FROM PROCESS p0 LEFT OUTER JOIN TABLE_B ON ... LEFT OUTER JOIN TABLE_C ON ... WHERE TABLE_B.idがヌルでないかTABLE_C.idがヌルでない ' – JimmyB

答えて

1

私はあなたがサブクエリでそれらUNION文を交換し、持続性プロバイダのORMサポートの使用を達成するためにJPQL/HQLを使用できると思います:

select p.name as name 
from Process p 
where (p.id, p.name) in 
    (
     select pp.id,pp.name from Process pp inner join pp.tableB b ... 
    ) 
    or (p.id, p.name) in 
    (
     select pp.id,pp.name from Process pp inner join pp.tableC c ... 
    ) 
    or (p.id, p.name) in 
    (
     select pp.id,pp.name from Process pp inner join pp.tableA a ... 
    ) 

order by name 
+0

ありがとう!これは働いた – slash3584

関連する問題