0

私はテーブルを持っています:

PROCESSES  STEP_STATUSES  STEPS
---------  -------------  -----------
PROC_ID    STAT_ID        STEP_ID
PROC_NAME  NAME           STEP_NUMBER
...                       STEP_NAME
                          ...
                          STAT_ID
                          PROC_ID

Processes テーブルをプロパティ CurrentStep (マップされた STEPS テーブル行) を使用して NHibernate にマップする方法はありますか?

マッピングで必要なことはほとんどできます。

<many-to-one name="CurrentStep" formula="(
  select t.step_id
  from STEPS t
  where PROC_ID = t.PROC_ID 
    and STEP_NUMBER = nvl((select max(STEP_NUMBER), PROC_ID from STEPS where STAT_ID > 0 and PROC_ID = t.PROC_ID),
                                (select min(STEP_NUMBER), PROC_ID from STEPS where STAT_ID = 0 and PROC_ID = t.PROC_ID))
)"/>

しかし、このフィールドに fetch="join" を設定することはできません。次のように、CurrentStep プロパティ値を使用して、1 つのクエリですべてのデータを取得したいと考えています。

select t.*, st.*
from PROCESSES t
left outer join (
    select STEP_ID, PROC_ID 
    from STEPS s1
    where STEP_NUMBER = nvl((select max(STEP_NUMBER) from STEPS where STAT_ID > 0 and PROC_ID = s1.PROC_ID),
                            (select min(STEP_NUMBER) from STEPS where STAT_ID = 0 and PROC_ID = s1.PROC_ID))
          ) s on s.PROC_ID = t.PROC_ID
left outer join STEPS st on st.PROC_ID = s.PROC_ID and st.STEP_ID = s.STEP_ID

パフォーマンスのために必要です。

したがって、質問ID:

  1. このような複雑な数式フィールドに fetch="join" を設定する方法はありますか?
  2. このような複雑なサブクエリに参加する方法はありますか?
  3. マッピングを設定できない場合、そのようなクエリ結果を取得するために ICriteria を作成する方法はありますか?

質問が明確でない場合は申し訳ありませんが、質問があれば明確にするよう努めます/

4

1 に答える 1

1

バッチ読み取りを使用して必要なものをクエリするアイデア

var lastStepWithStatus = session.CreateCriteria<Step>()
    .Add(Restriction.Eq("Process.Id", processId))
    .Add(Restriction.NotNull("Status"))
    .AddOrder(Order.Desc("Number"))
    .SetMaxResults(1)
    .Future<Step>();

var firstStepWithoutStatus = session.CreateCriteria<Step>()
    .Add(Restriction.Eq("Process.Id", processId))
    .Add(Restriction.IsNull("Status"))
    .AddOrder(Order.Asc("Number"))
    .SetMaxResults(1)
    .Future<Step>();

return lastStepWithStatus.Concat(firstStepWithoutStatus).Select(step => new { Process = Step.Process, CurrentStep = step }).FirstOrDefault();

別のオプションは、Steps コレクションで LINQ を使用して現在のステップを取得することです。これは、すべてのステップが最初に読み込まれることを意味します。

于 2012-08-29T11:17:39.720 に答える