2009-08-13 13 views
1

Vu le fichier de mappage suivant où TemporaryAccessOpenCommand et TemporaryAccessCloseCommand héritent de la classe de base de commandeNhibernate numéro de requête

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

Quelle serait la requête NHibernate pour récupérer tous les OpenAccessCommand ayant pas réussi CloseAccessCommand?

J'ai essayé ceci:

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>(); 
     }); 
    } 

Mais il retournera un OpenAccessCommand qui a remorque CloseCommand (un échec et on a réussi) quand il doit retourner une liste vide.

Merci pour votre aide (et excuser mon mauvais anglais)

Répondre

0

j'ai réussi à obtenir quelque chose de travailler de cette façon (je suis ouvert aux suggestions si ce n'est pas la meilleure façon)

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>(); 
     }); 
    }