【发布时间】: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