Join 覆盖联接';在';标准中的主列

Join 覆盖联接';在';标准中的主列,join,nhibernate,criteria,createcriteria,Join,Nhibernate,Criteria,Createcriteria,我使用的是条件,我想明确地告诉hibernate在特定列上连接,而不是主键列和外键列。我的代码是 CreateCriteria<Application>("Application") .CreateCriteria("Application.Address", "Address", JoinType.FullJoin) 我希望查询结果如下所示 Select * from Application app Full Join Address add ON app.PersonId =

我使用的是条件,我想明确地告诉hibernate在特定列上连接,而不是主键列和外键列。我的代码是

CreateCriteria<Application>("Application")
.CreateCriteria("Application.Address", "Address", JoinType.FullJoin)
我希望查询结果如下所示

Select * from Application app Full Join Address add ON app.PersonId = add.PersonId
我把我的标准改为

CreateCriteria<Application>("Application")
.CreateCriteria("Application.Address", "Address", JoinType.FullJoin, Restrictions.eqProperty("Application.Person.Id", "Address.Person.Id"))

是否有一种方法可以在我希望的联接的标准中明确提及

NHibernate总是基于外键进行连接。 我猜您已经通过
Application.AddressId
外键配置了
Application
Address
实体之间的关系。 这就是为什么在join中有app.AdressId=add.Id

如果我是对的,你不能在其他属性上进行连接。 您可以通过子查询找到较慢的解决方法,或者手动编写sql查询

见其他答案:

  • CreateCriteria<Application>("Application")
    .CreateCriteria("Application.Address", "Address", JoinType.FullJoin, Restrictions.eqProperty("Application.Person.Id", "Address.Person.Id"))
    
    Select * from Application app Full Join Address add ON app.PersonId = add.PersonId and app.AdressId = add.Id