2016-08-04 10 views
0

私はquiberysを作成するためにhibernate/hqlを使用しています。HQLはマッピングのない外部結合を残しました

は私がから情報を取得する必要が3つのテーブルを持って、私が得た接続/割り当てテーブルで: は今、私は 私がsorroundingされ、ここで状況を理解するために、今、かなりの時間のためにこだわって問題を抱えて全体的に5。 必要な情報はKey、Type、およびSourceFileですが、特殊なケースは です。新しいデータをインポートするときにsqlが実行されるため、まずデータが であるかどうか、または部分的に存在しているかどうか確認します。 キー自体がすでにデータベースに入っている場合は、TypeまたはSourceFile に関係なく、キーは常に私に渡す必要があります。また、キーのみを必要とし、それ以外のキーは必要ありません。 情報。 (キーは一致しますが、SourceFileとTypeは一致しません。したがって、キーのみを返します) キーが完全に同じTypeおよびSourceFileで存在する場合は、すべての情報を取得します。

の表は以下のとおりです。

+-------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-------------+--------------+------+-----+---------+----------------+ 
| K_ID  | bigint(20) | NO | PRI | NULL | auto_increment | 
| key   | varchar(255) | NO |  | NULL |    | 
| deleted  | boolean  | NO |  | FALSE |    | 
+-------------+--------------+------+-----+---------+----------------+ 

キー(ヘッドアップFK_K_IDは、名前のキーを持つオブジェクトとして保存されているが、 FK_S_IDはタイプとして保存されるソースとFK_T_IDとして保存されます)

ます。KeyType:

+-------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-------------+--------------+------+-----+---------+----------------+ 
| KT_ID  | bigint(20) | NO | PRI | NULL | auto_increment | 
| FK_K_ID  | bigint(20) | NO |  | NULL |    | 
| FK_T_ID  | bigint(20) | NO |  | NULL |    | 
| deleted  | boolean  | NO |  | FALSE |    | 
+-------------+--------------+------+-----+---------+----------------+ 

タイプ:

+-------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-------------+--------------+------+-----+---------+----------------+ 
| T_ID  | bigint(20) | NO | PRI | NULL | auto_increment | 
| name  | varchar(255) | NO |  | NULL |    | 
| description | varchar(255) | NO |  | NULL |    | 
| deleted  | boolean  | NO |  | FALSE |    | 
+-------------+--------------+------+-----+---------+----------------+ 

KeySource:

+-------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-------------+--------------+------+-----+---------+----------------+ 
| KS_ID  | bigint(20) | NO | PRI | NULL | auto_increment | 
| FK_K_ID  | bigint(20) | NO |  | NULL |    | 
| FK_S_ID  | bigint(20) | NO |  | NULL |    | 
| deleted  | boolean  | NO |  | FALSE |    | 
+-------------+--------------+------+-----+---------+----------------+ 

出典:

+-------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-------------+--------------+------+-----+---------+----------------+ 
| S_ID  | bigint(20) | NO | PRI | NULL | auto_increment | 
| sourceFile | varchar(255) | NO |  | NULL |    | 
| deleted  | boolean  | NO |  | FALSE |    | 
+-------------+--------------+------+-----+---------+----------------+ 

、ここでは、私がこれまで試したものです:

from KeyType kt 
right outer join kt.Key k 
with k.name in (...) 
where k.deleted = false 
and (kt.Type in (...) or kt is null) 

この1の問題は一種こと、です私がしたいことをします。私はデータベース内のすべてのキーとそれが一致する場合にのみKeyTypeを取得し、そうでない場合はnullを取得します。私はすべての鍵を取得したくないのです。私が求めた鍵を取得したいだけです。

from KeyType kt 
right outer join kt.Key k 
with k.name in (...) 
where k.deleted = false 
and (k.name in (...) and kt.Type in (...) or kt is null) 

私はここで正直で何を試したのか分かりません。私は私が求めたキーを与えるだけの最初のクエリを最適化しようとしたと思います。

from KeyType kt 
right outer join fetch kt.Key k 
where k.deleted = false 
and (k.name in (...) and kt.Type in (...) or kt is null) 

はまた、私はこのように、または他のバリエーションでフェッチを使用してみましたが、私はそれが必要のように動作しませんでした。

from Key k 
left outer join KeyType kt on kt.Key.id = k.id 
left outer join KeySource ks on ks.Key.id = k.id 
inner join Source s on ks.Source.id = s.id 
where k.deleted = false 
and k.name in (...) 
and (kt.appType in (...) or kt is null) 
and (s.SourceFile in (...) or s is null) 

うまくいけば、これはうまくいきません。私はそれが動作することはできませんが、あなたがそれにハングアップすることができない場合は多くを試してみることはかなりsimpelを意味する 。

私は多くの組み合わせとクエリーのバリエーションを試しましたが、運がありません。最初のクエリは私が得た最も近いものです。 私は誰かが私を助けることを願っています。

PS:マッピングやエンティティを変更することはできません。私は私が持っているものと仕事をしなければならない。

UPDATE:

さて私は問題を解決するための非常に近いと思います。私のクエリは次のようになります:

select k, case when kt.Type not in (...) then null 
       else 1 end 
from KeyType kt 
join kt.Key k 
where k.name in (...) 

ここで私が欲しいのは、実際のオブジェクトと1を交換することだけです。しかし、私がこれを行うと、 "org.hibernate.exception.GenericJDBCException:クエリを実行できませんでした"というエラーが表示されます(oracle dbで実行中)

誰かに解決方法を教えてもらえますか?

答えて

0

私の場合、私がしたかったやり方ではありません。

私は再び同僚に尋ねました。私たちは解決策に私たちが1つの質問でそれをしなければならなかった。

この投稿と同じテーブル設定/問題を持つ人には、これを伝えてください。

関連する問題