1

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 で書き直すこともできます。

これらは私の唯一のオプションですか?

4

1 に答える 1

3

私はまったく同じ質問をし、NHibernate開発チームのメンバーの1人に直接質問しました。これが、私が得た答えです。

Criteria APIを使用すると、プロジェクションリストを使用して、ルートエンティティのすべてのプロパティを含めることができます。その場合は、AliasToBeanResultTransformerを使用する必要があります。明らかに最適なソリューションからはほど遠い

hqlを使用してクエリを書き直してもかまわない場合は、非常に簡単に行うことができます。「fromMyEntityejoin e.Association」というhqlクエリは、エンティティ列と関連付けの列の両方を選択します(基準で発生している問題と同じように)。ただし、「MyEntity e join e.Associationからeを選択」というhqlクエリでは、eの列のみが選択されます。

于 2009-11-12T15:01:44.773 に答える