2

実際に実行せずに、コードでnhibernateによって作成されるSQLを取得することは可能ですか?

基準APIを介して構築した複雑な基準オブジェクトがあります。この基準オブジェクトは、さまざまなselectステートメントのベースを形成します。次に、このベースを使用して、アプリケーション全体のさまざまなシナリオで必要な追加の基準を追加できます。

selectステートメントの1つにhave句を追加する必要がありますが、これは条件apiを使用するオプションではないようです。必要なプロジェクションを作成できます。生成されたSQLを表示する場合、既存の基準の下部に追加する必要があるのは...

HAVING SUM(J.HoursAssigned) <> sum(JTB.HourQty)

非常に接近しているのは非常にイライラしますが、生成されたSQLの下部にタグを付けるための余分な行を1行取得できないようです。

生成されたSQLを抽出できれば、必要なhaving句にタグを付けて、NhibernateSQLQueryCriteriaを介してすべてを送信できると思います。

私はそれが理想的ではないことを知っていますが、残りが共通の基準ベースを共有しているときに1つのクエリをHQLまたはSQLで記述するよりも、これは私には良いように思えます。

これは可能ですか、それは良い考えですか?どんな代替案も歓迎されます。

4

1 に答える 1

4

上記のコメントで言及された投稿で、私は次のコードスニペットがうまく機能していることを発見しました。

public static string GenerateSQL(ICriteria criteria)
    {
        NHibernate.Impl.CriteriaImpl criteriaImpl = (NHibernate.Impl.CriteriaImpl)criteria;
        NHibernate.Engine.ISessionImplementor session = criteriaImpl.Session;
        NHibernate.Engine.ISessionFactoryImplementor factory = session.Factory;

        NHibernate.Loader.Criteria.CriteriaQueryTranslator translator = 
            new NHibernate.Loader.Criteria.CriteriaQueryTranslator(
                factory, 
                criteriaImpl, 
                criteriaImpl.EntityOrClassName, 
                NHibernate.Loader.Criteria.CriteriaQueryTranslator.RootSqlAlias);

        String[] implementors = factory.GetImplementors(criteriaImpl.EntityOrClassName);

        NHibernate.Loader.Criteria.CriteriaJoinWalker walker = new NHibernate.Loader.Criteria.CriteriaJoinWalker(
            (NHibernate.Persister.Entity.IOuterJoinLoadable)factory.GetEntityPersister(implementors[0]),
                                translator,
                                factory,
                                criteriaImpl,
                                criteriaImpl.EntityOrClassName,
                                session.EnabledFilters);

        return walker.SqlString.ToString();
    }
于 2011-11-01T10:00:28.157 に答える