nhibernate交叉表查询优化

nhibernate交叉表查询优化,nhibernate,optimization,criteria,Nhibernate,Optimization,Criteria,我用NHibernate的Criteria功能编写了一个查询,我想对它进行优化。该查询连接4个表。查询工作正常,但生成的SQL返回4个表的所有列,而不是我想要返回的信息。我在查询中使用SetResultTransformer,将返回的数据格式化为单个数据,但直到从服务器返回较大的sql之后 这是NHibernate的标准 return session.CreateCriteria(typeof(Individual)) .CreateAlias("Exte

我用NHibernate的Criteria功能编写了一个查询,我想对它进行优化。该查询连接4个表。查询工作正常,但生成的SQL返回4个表的所有列,而不是我想要返回的信息。我在查询中使用SetResultTransformer,将返回的数据格式化为单个数据,但直到从服务器返回较大的sql之后

这是NHibernate的标准

        return session.CreateCriteria(typeof(Individual))
            .CreateAlias("ExternalIdentifiers", "ExternalIdentifier")
            .CreateAlias("ExternalIdentifier.ExternalIdentifierType", "ExternalIdentifierType")
            .CreateAlias("ExternalIdentifierType.DataSource", "Datasource")
            .Add(Restrictions.Eq("ExternalIdentifier.Text1", ExternalId))
            .Add(Restrictions.Eq("ExternalIdentifierType.Code", ExternalIdType))
            .Add(Restrictions.Eq("Datasource.Code", DataSourceCode))
            .SetResultTransformer(new NHibernate.Transform.RootEntityResultTransformer());
生成的sql(来自NHProfiler)是

我只想从单个表中返回列。我可以设置一个投影,但是我会丢失单个类型

我也可以用DetachedCriteria重写这个


这些是我唯一的选择吗?

我有一个完全相同的问题,直接问了一位NHibernate开发团队成员,下面是我得到的答案:

使用CriteriaAPI,您唯一能做的就是使用投影列表并包含根实体的所有属性。。。然后需要使用别名ToBeanResultTransformer。显然远不是最优解

如果您不介意用hql重写查询,那么您可以非常轻松地完成。显示“from MyEntity e join e.Association”的hql查询将同时选择实体列和关联列(就像您遇到的条件问题一样)。但是一个hql查询说“SELECTE from MyEntity e join e.Association”只会选择e的列

SELECT (all columns from all joined tables)
FROM   INDIVIDUAL this_
       inner join EXTERNAL_ID externalid1_
         on this_.INDIVIDUAL_GUID = externalid1_.GENERIC_GUID
       inner join EXTERNAL_ID_TYPE externalid2_
         on externalid1_.EXTERNAL_ID_TYPE_GUID = externalid2_.EXTERNAL_ID_TYPE_GUID
       inner join SYSTEM_SRC datasource3_
         on externalid2_.SYSTEM_SRC_GUID = datasource3_.SYSTEM_SRC_GUID
WHERE  externalid1_.EXTERNAL_ID_TEXT_1 = 96800 /* @p0 */
       and externalid2_.EXTERNAL_ID_TYPE_CODE = 'PATIENT' /* @p1 */
       and datasource3_.SYSTEM_SRC_CODE = 'TOUCHPOINT' /* @p2 */