流利的NHibernate:如何执行INNER JOIN?

时间:2018-01-15 18:33:54

标签: c# join nhibernate fluent-nhibernate

我想知道是否有人可以帮助我。我想使用HibernateJpaSessionFactoryBean执行SQL INNER JOIN操作。首先让我向您介绍我的数据库的结构。

enter image description here

我的NHibernate方法中包含以下参数:C#int documentIdint userId。我的主要目标是获得int folderId。通过使用RoleDocumentValueEntityUSER_ID,我可以获得唯一的FOLDER_ID。我正在寻找FolderUserRoleEntity。我想在ROLE_ID之后加入ROLE_DOCUMENT_VALUEFOLDER_USER_ROLES表格,其中ROLE_ID等于我作为DOCUMENT_ID方法参数的特定值。

我的实体:

C#

映射:

 public class RoleDocumentValueEntity
    {
        public virtual int Id { get; set; }
        public virtual RoleEntity Role { get; set; }
        public virtual DocumentEntity Document { get; set; }
        public virtual string Text { get; set; }
    }

    public class RoleEntity 
    {
        public virtual int Id { get; set; }
        public virtual string Name { get; set; }
        public virtual IList<UserRoleEntity> UserRoles { get; set; }
        public virtual IList<FolderUserRoleEntity> FolderUserRoles { get; set; }
    }

    public class FolderEntity
    {
        public virtual int Id { get; set; }
        public virtual UserEntity User { get; set; }
        public virtual IList<DocumentEntity> Documents {get; set;}
    }

    public class UserEntity
    {
        public virtual int Id { get; set; }
        public virtual string Name { get; set; }
    }

    public class UserRoleEntity
    {
        public virtual int Id { get; set; }
        public virtual int UserId { get; set; }
        public virtual RoleEntity Role { get; set; }
    }

    public class FolderUserRoleEntity
    {
        public virtual int Id { get; set; }
        public virtual int UserId { get; set; }
        public virtual RoleEntity Role { get; set; }
        public virtual FolderEntity Folder { get; set; }
    } 

INNER JOIN

我使用public class RoleDocumentValueMap : BaseDatabaseMap<RoleDocumentValueEntity> { public RoleDocumentValueMap() { this.Table("ROLE_DOCUMENT_VALUE"); Id(x => x.Id, "ROLE_DOCUMENT_VALUE_ID"); // Relationships References(x => x.Role) .Column("ROLE_ID") .Cascade.None(); References(x => x.Document) .Column("DOCUMENT_ID") .Cascade.None(); } } public class RoleMap : BaseDatabaseMap<RoleEntity> { public RoleMap() { this.Table("ROLES"); Id(x => x.Id, "ROLE_ID"); HasMany(x => x.UserRoles) .KeyColumn("ROLE_ID") .Cascade.All() .Inverse(); HasMany(x => x.FolderUserRoles) .KeyColumn("ROLE_ID") .Cascade.All() .Inverse(); } } public class UserRoleMap : BaseDatabaseMap<UserRoleEntity> { public UserRoleMap() { this.Table("USER_ROLES"); this.Id(x => x.Id, "USER_ROLE_ID"); Map(x => x.UserId).Column("USER_ID"); References(x => x.Role).Column("ROLE_ID").Cascade.None().Fetch.Join(); } } public class FolderUserRoleMap : BaseDatabaseMap<FolderUserRoleEntity> { public FolderUserRoleMap() { this.Table("FOLDER_USER_ROLES"); Id(x => x.Id, "FOLDER_USER_ROLE_ID"); Map(x => x.UserId).Column("USER_ID"); References(x => x.Folder).Column("FOLDER_ID").Cascade.None().Fetch.Join(); References(x => x.Role).Column("ROLE_ID").Cascade.None().Fetch.Join().Not.LazyLoad(); } } public class FolderMap : BaseDatabaseMap<FolderEntity> { public FolderMap() { this.Table("FOLDERS"); Id(x => x.Id, "FOLDER_ID"); HasMany(x => x.Documents) .Cascade .AllDeleteOrphan() .Inverse() .KeyColumn("FOLDER_ID"); } } public class DocumentMap : BaseDatabaseMap<DocumentEntity> { public DocumentMap() { this.Table("DOCUMENTS"); Id(x => x.Id, "DOCUMENT_ID"); // Relationships References(x => x.Folder) .Column("FOLDER_ID") .Cascade.None(); } } 手动创建了我想要的SQL查询。

NHibernate

看起来我的SELECT ROLE_DOCUMENT_VALUE.* FROM ROLE_DOCUMENT_VALUE INNER JOIN FOLDER_USER_ROLES ON FOLDER_USER_ROLES.ROLE_ID = ROLE_DOCUMENT_VALUE.ROLE_ID AND FOLDER_USER_ROLES.FOLDER_ID = ? AND FOLDER_USER_ROLES.USER_ID = ? AND ROLE_DOCUMENT_VALUE.DOCUMENT_ID = ?; 条件看起来应该像这样:

NHibernate

但是由于var result = this.Session.CreateCriteria<RoleDocumentValueEntity>() .CreateCriteria("FolderUserRoles", "fr") .Add(Restrictions.Eq("fr.UserId", userId)) // etc .List(); 没有RoleDocumentValueEntity这样的属性,因此无法执行此条件。

拜托,您能否告诉我这种情况下的最佳做法是什么?如何使用FolderUserRoles

创建我想要的SQL查询

1 个答案:

答案 0 :(得分:0)

你可以使用linq支持Nhibernate来轻松实现这一目标,

from doc in Session.Query<RoleDocumentValueEntity>() 
join role in Session.Query<FolderUserRoleEntity>() 
on doc.Role equals role.Role