未映射实体上的nHibernate计数

未映射实体上的nHibernate计数,nhibernate,nhibernate-mapping,hql,Nhibernate,Nhibernate Mapping,Hql,使用nHibernate 2 在我们的系统中,我们有一个表来存储可能指向系统中任何其他表的记录,以及一些附加字段。e、 g class PointerTable { public int ID; public string ObjectName; public int RecordID; ... additional fields } ObjectName和RecordID字段指向系统中另一个表的名称,以及该记录指向的该表中记录的ID。此表与系统中的其他表之间没

使用nHibernate 2

在我们的系统中,我们有一个表来存储可能指向系统中任何其他表的记录,以及一些附加字段。e、 g

class PointerTable
{
    public int ID;
    public string ObjectName;
    public int RecordID;
    ... additional fields
}
ObjectName和RecordID字段指向系统中另一个表的名称,以及该记录指向的该表中记录的ID。此表与系统中的其他表之间没有关系

当我从系统中的其他表中检索记录时,我需要能够连接到此表,因为我需要确定一个表的PointerTable中是否有指向它的任何记录。i、 e.获取该记录指针表中记录的计数

我在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配置文件中,该表将指向这些实体。因此,我可以在每个其他实体中收集指针表记录。虽然我不确定这是否可行。我找不到如何将映射设置为映射到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>

这里的想法是使用where子句映射此集合

使用fluentmapping:

public SomeEntityMap(){
    Table("SomeTable");

    HasMany(x => x.PointerRecords)
        .Table("PointerTable")
        .KeyColumn("ThisEntityID")
        .Where("ObjectName = 'SomeTable'")
}
开始编辑

使用xml映射

<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()
object[]results=session.CreateCriteria()
.添加(限制。等式(“Id”,Id))
.SetProjection(Projections.ProjectionList()项目)
.Add(Projections.Property(“Field1”))
...
.Add(projects.Count(“PointerRecords”));
.List()

var entities=session.CreateCriteria()
.Add(限制.Eq(“Id”,Id)
.SetFetchMode(“PointerRecords”,NHibernate.FetchMode.Eager)
.List();
实体[0]。PointerRecords.Count

除了没有“分组依据”部分外,您的HQL似乎还算正常。到底是什么不起作用?您是否收到异常?错误的结果?事实上,我收到了一个NHibernate.QueryException异常“未定义的别名或未知映射:d”如果删除别名,生成的SQL不正确(…count\u big(选择FROM PointerTable where ObjectName=“Table1”和RecordID=a.ID)作为x1_0_)…)而不是类似于选择(COUNT()FROM PointerTable where…)我得到了一个SqlClient.SqlException异常。谢谢你的回复Firo,但我们没有使用fluent nhibernate。@matt我添加了xml映射非常好!谢谢你。HQL现在使用了PointerRecords.size和group by。还添加了access=“none”属性,因此我不必将集合添加到实体ob中JET(尽管我们可能希望添加它,因为现在这个映射是可能的)。非常感谢。
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