0

我有桌子:

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

有什么方法可以将 Processes 表映射到 NHibernate 中,并带有 CurrentStep 属性(这是一个映射的 STEPS 表行)?

我几乎可以用映射做我需要的事情:

<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 属性值——像这样:

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 回答