Hibernate version: 1.2 GA
Mapping documents:
Code:
<composite-id unsaved-value ="any" >
<key-many-to-one class ="Members" name="Members">
<column name="`Member_id`" />
</key-many-to-one>
<key-many-to-one class ="Membership_Fees" name="Membership_Fees">
<column name="`Member_id`" />
<column name="`FeeDate`" />
</key-many-to-one>
<key-property name="PayDate" column="`PayDate`" type="System.DateTime" >
</key-property>
</composite-id>
The CodeCode:
ICriteria _criteria = Session.CreateCriteria(typeof(MembersPaidFees),"MembersPaidFees");
// Please notice that for "navigating" Members i don't need to create a nested criteria.
_criteria.Add(new EqExpression("Members.Member_id" ,pMember_id));
// If i apply the same pattern for the 2nd Key-Many-to-One
_criteria.Add(new EqExpression("Membership_Fees.FeeDate" ,pFeeDate));
_criteria.Add(new EqExpression("PayDate", pPayDate));
_bo = (MembersPaidFees) _criteria.UniqueResult();
The Exception base {NHibernate.QueryException: could not resolve property: Membership_Fees.FeeDate of: BOGlobalOptions_Test_BoLayer.MembersPaidFees
at NHibernate.Persister.Entity.AbstractPropertyMapping.ThrowPropertyException(String propertyName)
at NHibernate.Persister.Entity.AbstractPropertyMapping.ToColumns(String alias, String propertyName)
at NHibernate.Persister.Entity.AbstractEntityPersister.ToColumns(String alias, String propertyName)
at NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetColumns(String propertyName, ICriteria subcriteria)
at NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetColumnsUsingProjection(ICriteria subcriteria, String propertyName)
at NHibernate.Expression.SimpleExpression.ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary enabledFilters)
at NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetWhereCondition(IDictionary enabledFilters)
at NHibernate.Loader.Criteria.CriteriaJoinWalker..ctor(IOuterJoinLoadable persister, CriteriaQueryTranslator translator, ISessionFactoryImplementor factory, CriteriaImpl criteria, Type rootEntityName, IDictionary enabledFilters)
at NHibernate.Loader.Criteria.CriteriaLoader..ctor(IOuterJoinLoadable persister, ISessionFactoryImplementor factory, CriteriaImpl rootCriteria, Type rootEntityName, IDictionary enabledFilters)
at NHibernate.Impl.SessionImpl.Find(CriteriaImpl criteria, IList results)
at NHibernate.Impl.SessionImpl.Find(CriteriaImpl criteria)
at NHibernate.Impl.CriteriaImpl.List()
at NHibernate.Impl.CriteriaImpl.UniqueResult()} NHibernate.HibernateException {NHibernate.QueryException}
The workaround _criteria.CreateCriteria("Membership_Fees").Add(new EqExpression("FeeDate", pFeeDate));
What i don't understand is why a nested criteria is needed for "Membership_Fees" and
it's not needed for "Members".
At one moment i thought it could be the fact of multiple columns but it's not that since
i have the same issue in:
Code:
<composite-id unsaved-value ="any" >
<key-many-to-one class ="Books" name="Books" >
<column name="`ISBNNumber`" />
</key-many-to-one>
<key-many-to-one class ="Members" name="Members" >
<column name="`Member_id`" />
</key-many-to-one>
</composite-id>
Conclusion : it looks like only the 1st key-many-to-one is processed and the rest ignored.
Note: I would like to help in the NHibernate source if somebody gives any hint.
Can someone confirm if this is a bug / and if i should post it to JIRA?