NHibernate和JoinAlias抛出异常

NHibernate和JoinAlias抛出异常,nhibernate,queryover,Nhibernate,Queryover,我在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<NHDocumentComputedRigh

我在
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>();

谢谢

我想您对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>();
.JoinAlias(b => b.DocumentComputedRights, () => cp)
.Select(() => cp)

但是
表达式不存在。希望它能包含在下一个版本中。

AFAIK criteria/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>();
var subquery=QueryOver.Of()
.JoinAlias(b=>b.DocumentComputedRights,()=>cp)
其中(h=>h.Id==rightsHolder.Id&&cp.organizationalUnit.Id==person.Id)
.选择(u=>cp.Id);
var right=\u session.QueryOver()
.WithSubquery.Where(r=>r.Id).Eq(子查询)
.SingleOrDefault();

它是否适用于
cp.organizationalUnit==person
?否,因为问题在。选择(U=>cp)部分。当我删除此项(或更改为Select(u=>cp.Id)时,此查询将起作用。NHDocumentComputedRight中是否有对NHFolder的反向引用?没有对NHFolder的反向引用。这是多个关系。我尝试了您的查询,但出现以下异常:[从文件夹中选择此u.Id作为y0 uu,此u内部联接文档计算权限此u.Id=documentco3 u3.nhfolder键内部联接文档计算权限cp1 3 3.elt=cp1 1.Id,其中(此0.Id=@p0和cp1 1.OrganizationalUnit=@p1)]Name:cp0-Value:65536 Name:cp1-Value:32769。但奇怪的是,这个查询(在sql中)仍然返回NHFolder id(this.id)而不是NHDocumentComputedRights。关于您的信息,这是NHFolder和NHDocumentComputedRights之间的许多关系。您也可以粘贴映射吗?生成的sql似乎不正确-您使用的是哪个版本的NHibernate?向问题添加了映射。我跳过了不重要的属性。我使用NH3.2
.JoinAlias(b => b.DocumentComputedRights, () => cp)
.Select(() => cp)
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>();