使用nHibernate 2。
在我们的系统中,我们有一个表,用于存储可能指向系统中任何其他表的记录,以及一些其他字段。 e.g。
class PointerTable
{
public int ID;
public string ObjectName;
public int RecordID;
... additional fields
}
ObjectName和RecordID字段指向系统中另一个表的名称,以及该记录所指向的该表中记录的ID。此表与系统中的其他表之间没有关系。
当我从系统中的其他表中检索记录时,我需要能够加入此表,因为我需要确定一个表是否在PointerTable中有任何指向它的记录。即获取此记录的PointerTable中的记录计数。
我试过在HQL中这样做:
select a.ID, e.Field1, a.Field2, a.Field3,
count(select *
from PointerTable p
where p.ObjectName = "Table1"
and p.RecordID = a.ID)
from Table1 a
where a.ParentTable.ID = :ID
我还研究了如何将映射放入系统中所有实体的XML配置文件中,这些实体将由此表指向。所以我可以在每个其他实体中拥有一个PointerTable记录集合。虽然我不确定这是否可行。我找不到如何将映射设置为映射到2个字段而不是主键。
类似的东西:
<bag name="PointerRecords" table="PointerTable" lazy="true" inverse="true">
<key>
<column name="ThisEntityID" />
<column name="ObjectName" /> ?? Hard coded
</key>
<one-to-many class="PointerTable" not-found="ignore"/>
</bag>
这甚至可能吗?
基本上我所要做的就是以下SQL查询。但理想情况下,我们希望通过HQL或映射来实现这一目标。
SQL
select a.ID, e.Field1, a.Field2, a.Field3, Count(d.ID)
from Table1 a
inner join Table2 e on a.ParentID=e.ID
left outer join PointerTable d on d.ObjectName = 'Table1' and d.RecordID = a.ID
where c.ID = @ID
group by a.ID, e.Field1, a.Field2, a.Field3
答案 0 :(得分:1)
这里的想法是用where子句
映射这个集合使用流利图:
public SomeEntityMap(){
Table("SomeTable");
HasMany(x => x.PointerRecords)
.Table("PointerTable")
.KeyColumn("ThisEntityID")
.Where("ObjectName = 'SomeTable'")
}
开始编辑
使用xml-mapping
<bag name="PointerRecords" table="PointerTable" lazy="true" inverse="true" where ="ObjectName = 'SomeTable'">
<key column="ThisEntityID"/>
<one-to-many class="PointerTable" not-found="ignore"/>
</bag>
结束编辑
和查询类似
object[] results = session.CreateCriteria<SomeEntity>()
.Add(Restrictions.Eq("Id", id))
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("Field1"))
...
.Add(Projections.Count("PointerRecords")));
.List()
或
var entities = session.CreateCriteria<SomeEntity>()
.Add(Restrictions.Eq("Id", id)
.SetFetchMode("PointerRecords", NHibernate.FetchMode.Eager)
.List<SomeEntity>();
entities[0].PointerRecords.Count