оптимизация запросов кросс-таблиц nhibernate - PullRequest
1 голос
/ 09 октября 2009

У меня есть запрос, который я написал с помощью функции критериев NHibernate, и я хочу его оптимизировать. Запрос объединяет 4 таблицы. Запрос работает, но сгенерированный SQL возвращает все столбцы для 4 таблиц, а не только информацию, которую я хочу вернуть. Я использую SetResultTransformer в запросе, который формирует возвращаемые данные для объекта Individual, но только после того, как больший 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.

Это мои единственные варианты?

1 Ответ

3 голосов
/ 12 ноября 2009

У меня был точно такой же вопрос, и я напрямую спросил одного из членов команды разработчиков NHibernate, вот ответ, который я получил:

с Criteria API единственное, что вы можете сделать, это использовать список проекций и включить все свойства корневого объекта ... тогда вам нужно будет использовать AliasToBeanResultTransformer. Очевидно, что далеко от оптимального решения

если вы не возражаете переписать запрос с помощью hql, то вы можете сделать это очень легко. hql-запрос, который говорит «из MyEntity e присоединиться к e.Association», выберет как столбцы сущностей, так и столбцы ассоциации (как и в случае с критериями). Но hql-запрос, который говорит «выберите e из MyEntity e присоединиться к e.Association», выберет только столбцы e.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...