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

Filed under:
|
|

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

Related posts about nhibernate

Related posts about c#