2009-08-13 8 views
1

がTemporaryAccessOpenCommandとTemporaryAccessCloseCommandの両方が、基本クラスのコマンドを継承し、次のマッピングファイルを考慮NHibernateのクエリの問題

<class name="Command" table="xxx_Commands" lazy="false"> 
<id name="Id" type="Int32" unsaved-value="0"> 
    <generator class="identity"/> 
</id> 
<property name="BeginDate" /> 
<property name="EndDate" /> 
<component name="Result" class="CommandResult"> 
    <property name="Status" column="ResultStatus"/> 
    <property name="Details" column="ResultDetails" /> 
</component> 

<many-to-one name="Requestor" class="xxx.Domain.SessionInfo, xxx.Domain" column="SessionInfoId" lazy="false" /> 

<joined-subclass name="xxx.TemporaryAccess.Commands.TemporaryAccessCloseCommand, xxx.TemporaryAccess" table="xxx_Commands_TemporaryAccess_Close"> 
    <key column="CommandId"/> 
</joined-subclass> 

<joined-subclass name="xxx.TemporaryAccess.Commands.TemporaryAccessOpenCommand, xxx.TemporaryAccess" table="xxx_Commands_TemporaryAccess_Open"> 
    <key column="CommandId"/> 
    <many-to-one name="EndUser" ...... /> 
    <property name="Reason"/> 
    <property name="AccessRight"/> 
    <property name="AccessType"/> 
    <bag name="CloseAccessCommands" cascade="all" lazy="false"> 
    <key column="OpenCommandId"/> 
    <one-to-many class="xxx.TemporaryAccess.Commands.TemporaryAccessCloseCommand, xxx.TemporaryAccess"/> 
    </bag> 
</joined-subclass> 

何決してCloseAccessCommandを成功持たないすべてのOpenAccessCommandを取得するためにNHibernateのクエリでしょうか?

私はこの試みた:

public IList<TemporaryAccessOpenCommand> FindOpenCommandsWithoutSucceededCloseCommand() 
    { 
     return this.HibernateTemplate.ExecuteFind<TemporaryAccessOpenCommand>(delegate(ISession session) 
     { 
      return session.CreateCriteria(typeof(TemporaryAccessOpenCommand)) 
       .CreateCriteria("CloseAccessCommands") 
       .Add(Expression.Not(Expression.Eq("Result.Status", CommandStatus.Succeeded))) 
       .List<TemporaryAccessOpenCommand>(); 
     }); 
    } 

をしかし、それは空のリストを返す必要があるときに曳航たCloseCommand(1が失敗し、1が成功した)を持っているOpenAccessCommandを返します。

あなたの助けのおかげで(と私の下手な英語を言い訳)

答えて

0

私は

public IList<TemporaryAccessOpenCommand> FindOpenCommandsWithoutSucceededCloseCommand() 
    { 
     return this.HibernateTemplate.ExecuteFind<TemporaryAccessOpenCommand>(delegate(ISession session) 
     { 
      string sql = string.Format(@" 
             (
              SELECT temp_c.OpenCommandId 
              FROM VSA2_Commands_TemporaryAccess_Close temp_c 
                INNER JOIN VSA2_Commands c 
                 ON temp_c.CommandId = c.Id 
              WHERE c.ResultStatus = {0} 
             ) AS OpenCommandId" 

             , (int)CommandStatus.Succeeded); 

      var subCriteria = DetachedCriteria.For<TemporaryAccessCloseCommand>(); 
      subCriteria = subCriteria.SetProjection(Projections.SqlProjection(sql, new string[] { "OpenCommandID" }, new IType[] { NHibernateUtil.Int32 })); 


      return session.CreateCriteria(typeof(TemporaryAccessOpenCommand)) 
       .Add(Expression.Eq("Result.Status", CommandStatus.Succeeded)) 
       .Add(Subqueries.PropertyNotIn("Id", subCriteria)) 
       .List<TemporaryAccessOpenCommand>(); 
     }); 
    } 
(それが最善の方法ではない場合、私は提案を開いてる)何かがこのように作業を取得するために管理