Search code examples
nhibernatenhibernate-mappingqueryover

NHibernate JoinAlias on collection multiple times


I'm using NHibernate 3.33 and QueryOver with Postgre 9.2. I've got two entities:

public class User {
    public virtual string Name { get; set; }
    public virtual IList<Reports> Reports { get; set; }
}

and

public class Report {
    public virtual string Type { get; set; }
    public virtual DateTime ReportDate { get; set; }
    public virtual User Author { get; set; }
}

with association - one-to-many (I didn't append additional fields to entities like Id or Name to snippets above). Some report's types are avaliable - month, day. My goal is to get summary for user - find out whether user has day-report and month-report for current day.

Note: month-report's ReportDate looks like first day of month. Also I want to get it as one row (if it was an SQL) to transform to dto:

public class UserSummaryDto {
    public bool HasDayReport { get; set; }
    public bool HasMonthReport { get; set; }
}

To achieve my goal I've tried following:

Report dayReport = null;
Report monthReport = null;
var currentDay; // some value of current day
var firstDay; // some value of first day of month
var report = session.QueryOver<User>
    .Left.JoinAlias(u => u.Reports, () => dayReport, r => r.ReportDate == currentDay)
    .Left.JoinAlias(u => u.Reports, () => monthReport, r => r.ReportDate == firstDat)
    .SelectList(
        // some logic to check whether user has reports
.TransformUsing(Transformers.AliasToBean<UserSummaryDto>())
.List<UserSummaryDto>()

And I've got error:

'duplicate association path:Reports'.

Is it possible to avoid this problem or it's a limitation of HNibernate?


Solution

  • To answer your question:

    ...Is it possible to avoid this problem or it's a limitation of HNibernate?

    Have to say NO.

    For more information see similar Q & A: Rename NHibernate criteria

    We are not querying the DB, not using SQL (which does allow to do a lot). Here we work with "mapped" domain model, and that could bring some limitations - as the one discussed here...

    If that could help, the workaround is to map such property twice and use the WHERE clause: 6.2. Mapping a Collection

    where="" (optional) specify an arbitrary SQL WHERE condition to be used when retrieving or removing the collection (useful if the collection should contain only a subset of the available data)