连接自定义列的表

时间:2013-12-05 07:54:03

标签: nhibernate nhibernate-mapping

我想基于表格而不是基于数据库级别的关系(PK,FK),但是有些自定义标准:

SELECT * FROM Users u inner join Docs d on u.Doc = d.ISBN

并将其映射到

public class User 
{
   public Doc Document { get; set; }
}
public class Doc
{
   public Int64 Id {get; protected set}
   public Int64 Isbn {get; set}
}

是否可以仅使用映射,还是需要在Criteria API上调用某些方法(我使用过)?

我尝试了以下内容:

public class UserMap : ClassMapping<User>
{
    public UserMap()
    {
        Table("Users");
        Id(x => x.Id, p => p.Column("Id"););
        ManyToOne(x => x.Document, m =>
        {
            m.Column("Doc");
            m.ForeignKey("ISBN");
            m.Fetch(FetchKind.Join);
            m.Access(Accessor.Property);
            m.Lazy(LazyRelation.NoLazy);
            m.NotNullable(true);
        });
    }
}
public class DocMap : ClassMapping<Doc>
{
    public DocMap()
    {
        Table("Docs");
        Id(x => x.Id, p => 
             { 
                p.Column("Id");   
                p.Generator(Generators.GuidComb); 
             });
        Property(x => x.Isbn, p => 
             { 
                p.Column("ISBN"); 
                p.NotNullable(true); 
             });
    }
}
//2.Criteria API
var criteria = Session.CreateCriteria("User")
// ...    
criteria.CreateCriteria("Document", "Docs", JoinType.InnerJoin, docCriterion);

但结果是:

SELECT * FROM Users u 
    inner join Docs d on u.Doc=d.Id /* docCriterion */ 
    left outer join Docs d2 on u.Doc=d.Id

1 个答案:

答案 0 :(得分:0)

试试这个

criteria.CreateCriteria("Users")
   .CreateCriteria("Document").Add(Restrictions.Eq("Isbn ", ?);
您的查询中的

u.Doc = d.ISBN不正确,因为文档是Doc实体,ISBN是数字