ISQLQuery using AddJoin not loading related instance
        Posted  
        
            by Remi Despres-Smyth
        on Stack Overflow
        
        See other posts from Stack Overflow
        
            or by Remi Despres-Smyth
        
        
        
        Published on 2010-03-16T13:10:11Z
        Indexed on 
            2010/03/17
            9:41 UTC
        
        
        Read the original article
        Hit count: 549
        
I've got a problem using an ISQLQuery with an AddJoin. The entity I'm trying to return is RegionalFees, which has a composite-id which includes a Province instance. (This is the the instance being improperly loaded.)
Here's the mapping:
<class name="Project.RegionalFees, Project" table="tblRegionalFees">
 <composite-id name="Id"
  class="Project.RegionalFeesId, project"
   unsaved-value="any" access="property">
  <key-many-to-one class="Project.Province, Project"
   name="Region" access="property" column="provinceId" not-found="exception" />
  <key-property name="StartDate" access="property" column="startDate" type="DateTime" />
 </composite-id>
 <property name="SomeFee" column="someFee" type="Decimal" />
 <property name="SomeOtherFee" column="someOtherFee" type="Decimal" />
 <!-- Other unrelated stuff -->
</class>
<class name="Project.Province, Project" table="trefProvince" mutable="false">
 <id name="Id" column="provinceId" type="Int64" unsaved-value="0">
  <generator class="identity" />
 </id>
 <property name="Code" column="code" access="nosetter.pascalcase-m-underscore" />
 <property name="Label" column="label" access="nosetter.pascalcase-m-underscore" />
</class>
Here's my query method:
public IEnumerable<RegionalFees> GetRegionalFees()
{
 // Using an ISQLQuery cause there doesn't appear to be an equivalent of 
 // the SQL HAVING clause, which would be optimal for loading this set
 const String qryStr = 
  "SELECT * " +
  "FROM tblRegionalFees INNER JOIN trefProvince " +
   "ON tblRegionalFees.provinceId=trefProvince.provinceId " +
  "WHERE EXISTS ( " +
   "SELECT provinceId, MAX(startDate) AS MostRecentFeesDate " +
   "FROM tblRegionalFees InnerRF " +
   "WHERE tblRegionalFees.provinceId=InnerRF.provinceId " +
    "AND startDate <= ? " +
   "GROUP BY provinceId " +
   "HAVING tblRegionalFees.startDate=MAX(startDate))";
 var qry = NHibernateSessionManager.Instance.GetSession().CreateSQLQuery(qryStr);
 qry.SetDateTime(0, DateTime.Now);
 qry.AddEntity("RegFees", typeof(RegionalFees));
 qry.AddJoin("Region", "RegFees.Id.Region");
 return qry.List<RegionalFees>();
}
The odd behavior here is that when I call GetRegionalFees (whose goal is to load just the most recent fee instances per region), it all loads fine if the Province instance is a proxy. If, however, Province is not loaded as a transparent proxy, the Province instance which is part of RegionalFees' RegionalFeesId property has null Code and Region values, although the Id value is set correctly.
It looks to me like I have a problem in how I'm joining the Province class - since if it's lazy loaded the id is set from tblRegionalFees, and it gets loaded independently afterwards - but I haven't been able to figure out the solution.
© Stack Overflow or respective owner