1

この質問の言い方が正しいかどうかはわかりませんが、これで終わりです。

これは、java、oracle、hibernate を使用した Web アプリケーションです。

1 (アイテム) 対多 (タスク) の関係にある 2 つのテーブルがあります。

アイテム

  • item_id 名
  • アクティブなステータス

タスク

  • task_id
  • item_id
  • アクティブなステータス
  • 進捗状況

アイテムのステータスは、そのすべてのタスクのステータスで構成されます。これがロジックです...

  • アイテム ステータスがキャンセルまたは保留中の場合...アイテム アクティブ ステータスを返す
  • タスクがない場合は Completed を返します
  • すべてのタスクがアクティブで置き換えられていない場合、
  • ...すべてのタスクが未開始の場合は、未開始を返します
  • ...すべてのタスクが完了した場合は Completed を返します
  • ...すべてのタスクが保留中の場合は保留に戻す
  • それ以外の場合は、Started を返します

SQL を使用してこれを行い、休止状態のマッピング ファイルのフィールドにマップしたいと考えています。

ここ数日いろいろ試しましたが、うまくいきません。レコードをグループ化してみましたが、1 つのレコードが見つかった場合は、そのステータスを返します。デコード、ケースなどを使用しました。

ここに私が試したことのいくつかの例があります。2 番目の例では、「単一のグループ グループ関数ではありません」というエラーが表示されます。

何かご意見は?

select decode(i.active_status_id, 'OH', i.active_status_id, 'Ca', i.active_status_id,t.progress_status_id)
        from tasks t 
        LEFT OUTER JOIN Items i
                ON i.item_id = t.item_id
        where t.item_id = 10927815 and t.active_status_id = 'Ac' and t.active_status_id != 'Su' 
        group by i.active_status_id, t.progress_status_id;




select case                         
        when (count(*) = 1) then progress_status_id
        else 'St'
        end
        from 
        (select progress_status_id
                from tasks t 
                        where t.item_id = 10927815 and (t.active_status_id = 'Ac' and t.active_status_id != 'Su') group by t.progress_status_id)
4

2 に答える 2

0

If you're using annotations you can use @Formula("sql query here") for your derived properties. See Hibernate formula docs for a (surprisingly brief) explanation.

Alternatively, since you're dealing with relatively large lists of items, it would be better to make the status calculations part of your initial query thus avoiding the database getting hammered by hundreds or thousands of requests. This is what will probably happen if you iterate over each item in the list.

I would recommend joining the status calculation to whatever query you are using to generate your list (presumably in a NamedQuery). This lets your database do all the heavy lifting without being slowed down by the network, which is what it is best at. The Hibernate docs give lots of helpful examples of queries you can try.

于 2013-08-23T16:20:15.927 に答える