NHibernate и JoinAlias ​​выдают исключение - PullRequest
2 голосов
/ 25 января 2012

У меня есть запрос в HQL, который работает хорошо:

var x =_session.CreateQuery("SELECT r FROM NHFolder f JOIN f.DocumentComputedRights r WHERE f.Id = " + rightsHolder.Id + " AND r.OrganisationalUnit.Id=" + person.Id);
            var right = x.UniqueResult<NHDocumentComputedRight>();

В основном я получаю экземпляр NHDocumentComputedRight.

Я пытался реализовать тот же запрос в QueryOver.Я сделал это:

var right = _session.QueryOver<NHFolder>().JoinAlias(b => b.DocumentComputedRights, () => cp).Where(h => h.Id == rightsHolder.Id && cp.OrganisationalUnit.Id == person.Id)
            .Select(u => cp).List<NHDocumentComputedRight>();

Но я получил исключение нулевой ссылки.

Как я могу реализовать этот запрос в QueryOver?

Обновление (добавлены сопоставления) - NHibernate 3.2:

public class FolderMapping: ClassMapping<NHFolder>
    {
        public FolderMapping()
        {
            Table("Folders");
            Id(x => x.Id, map =>
            {
                map.Generator(IdGeneratorSelector.CreateGenerator());
            });
//more not important properties...

            Set(x => x.DocumentComputedRights, v =>
            {
                v.Table("DocumentComputedRightsFolder");
                v.Cascade(Cascade.All | Cascade.DeleteOrphans);
                v.Fetch(CollectionFetchMode.Subselect);
                v.Lazy(CollectionLazy.Lazy);

            }, h => h.ManyToMany());


            Version(x => x.Version, map => map.Generated(VersionGeneration.Never));
            }
    }

public class DocumentComputedRightMapping : ClassMapping<NHDocumentComputedRight>
    {
        public DocumentComputedRightMapping()
        {
            Table("DocumentComputedRights");

            Id(x => x.Id, map =>
            {
                map.Generator(IdGeneratorSelector.CreateGenerator());
            });

//more not important properties...

            ManyToOne(x => x.OrganisationalUnit, map =>
            {
                map.Column("OrganisationalUnit");
                map.NotNullable(false);
                map.Cascade(Cascade.None);
            });

        }
    }

public class OrganisationUnitMapping : ClassMapping<NHOrganisationalUnit>
    {
        public OrganisationUnitMapping()
        {
            Table("OrganisationalUnits");
            Id(x => x.Id, map =>
                              {
                                  map.Generator(IdGeneratorSelector.CreateGenerator());
                              });

//more not important properties...

        }
    }

Спасибо

Ответы [ 2 ]

2 голосов
/ 30 января 2012

Критерии AFAIK / queryOver могут возвращать только ту сущность, для которой она была создана (NHFolder в вашем примере) или столбцы, для которых задана сущность с алиасосом.вместо этого вы можете сделать коррелированный подзапрос.

var subquery = QueryOver.Of<NHFolder>()
    .JoinAlias(b => b.DocumentComputedRights, () => cp)
    .Where(h => h.Id == rightsHolder.Id && cp.OrganisationalUnit.Id == person.Id)
    .Select(u => cp.Id);

var right = _session.QueryOver<NHDocumentComputedRight>()
    .WithSubquery.Where(r => r.Id).Eq(subquery)
    .SingleOrDefault<NHDocumentComputedRight>();
0 голосов
/ 29 января 2012

Я думаю, что у вас есть проблема с оператором select, вы пробовали что-то вроде этого:

var right = _session.QueryOver<NHFolder>()
    .JoinAlias(b => b.DocumentComputedRights, () => cp)
    .Select(x => x.DocumentComputedRights)
    .Where(h => h.Id == rightsHolder.Id && cp.OrganisationalUnit.Id == person.Id)
    .List<NHDocumentComputedRight>();

Это то, что работает для меня, поэтому оно должно работать и в вашем случае.

Я бы предположил, что основной причиной проблемы является отсутствие правильной перегрузки в методе Select.В действительности вы хотели бы написать это так:

.JoinAlias(b => b.DocumentComputedRights, () => cp)
.Select(() => cp)

, но Expression<Func<object>> там нет.Надеюсь, он будет включен в следующую версию.

...