2016-04-25 18 views
0

Hibernateを使用してhql/sqlクエリを作成する必要がありますが、Hibernateでどのように達成できるのか正確にはわかりません。バックエンドデータベースはSQL Serverです。Hibernate - 単純なデータだが複雑なSQLクエリ

私は、取引ステータステーブルが保留、預金、クリア&バウンスしています。

取引 - 表1

Seq Receipt ID  Status 
1  1234   Pending 
2  2345   Deposited 
3  3456   Cleared 
4  4567   Bounced 

は、最初のレコードがPendingです。レコードの移動はfrom Pending to Depositで、次にfrom Deposit to either Cleared or Bouncedです。 ClearedまたはBouncedのいずれかにステータスの変更に応じて、それは別のテーブルにデータを挿入します - 正常に動作しているTable 2

現在のHQLクエリは、単純にTable 1からデータを読み込み、特定のレシートIDについてTable 2で同じステータスを探します。

Select receiptID from Table1 where table1.status in ('Bounced','Cleared') 
and not exists (select table2.receiptID from Table2 where 
table1.receiptID = table2.receiptID and table2.status in ('Cleared','Bounced')) 

時間の任意の時点で表2におけるCleared or Bouncedのいずれかの1つのレコードが存在しますので、これは、これまでのところ良い作品以下のような何か。

新しい変更

今、必要な変更はTable2に同様Depositのレコードを入力することです。したがって、ステータスがPending to Depositから変更された場合は、Table2にデータを入力する必要があります。

明らかに、上記のクエリでDepositというステータスを追加するだけでは機能しません。 Depositの場合は正常に動作しますが、ステータスがDeposit to Cleared/Bouncedから変更される場合、システムはのTable2(サブクエリ)の既存のレコードを検出します。したがって、Cleared or Bouncedの新しいレコードは入力されません。 :(

私は労働組合でこれを行うことができると思いますが、どのように私はどんな複雑なクエリせずに休止状態(HQL)でそれを達成するかわからない。

ヘルププラザ!!!

答えて

0

のずっと後

。はい、私はちょうど表1と表2のクリアの寄託のための特定の条件が存在する別のものを追加する必要がありません。解決策を見つけることができるよ、考えて新しいクエリが

Select receiptID from Table1 where table1.status in ('Deposit','Bounced','Cleared') 
     and not exists (select table2.receiptID from Table2 
          where table1.receiptID = table2.receiptID 
          and table2.status in ('Cleared','Bounced') 
          and table1.status = table2.status) 
     and not exists (select table2.receiptID from Table2 
          where table1.receiptID = table2.receiptID 
          and table1.status in ('Deposit' 
          and table2.status in ('Cleared')) 
のように見えます