我想基于表格而不是基于数据库级别的关系(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
答案 0 :(得分:0)
试试这个
criteria.CreateCriteria("Users")
.CreateCriteria("Document").Add(Restrictions.Eq("Isbn ", ?);
您的查询中的 u.Doc = d.ISBN
不正确,因为文档是Doc
实体,ISBN是数字