【问题标题】:nhibernate cross table query optimizationnhibernate跨表查询优化
【发布时间】:2011-03-15 14:28:57
【问题描述】:

我有一个使用 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)是

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 */

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

我也可以用 DetachedCriteria 重写它。

这些是我唯一的选择吗?

【问题讨论】:

    标签: nhibernate optimization criteria


    【解决方案1】:

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

    使用 Criteria API,您唯一能做的就是使用投影列表并包含根实体的所有属性...然后您需要使用 AliasToBeanResultTransformer。显然远非最佳解决方案

    如果你不介意用 hql 重写查询,那么你可以很容易地做到这一点。一个显示“来自 MyEntity e join e.Association”的 hql 查询将同时选择实体列和关联列(就像您遇到的条件问题一样)。但是一个说“从 MyEntity e 加入 e.Association 中选择 e”的 hql 查询只会选择 e 的列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-29
      • 2012-01-30
      • 2015-01-14
      相关资源
      最近更新 更多