nHibernate指望未映射的实体

时间:2011-06-15 15:08:10

标签: nhibernate nhibernate-mapping hql

使用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

1 个答案:

答案 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