2

是否有可能在不实际运行的情况下获取 nhibernate 在您的代码中创建的 sql?

我有一个通过标准 API 构建的复杂标准对象。这个标准对象构成了各种选择语句的基础。然后,我可以以此为基础,在整个应用程序的不同场景中添加我需要的其他标准。

我现在需要在我的一个 select 语句中添加一个 having 子句,显然这不是使用标准 api 的选项。我可以创建我需要的投影,如果我查看生成的 sql,我需要添加到现有标准底部的是......

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

如此接近非常令人沮丧,但我似乎无法在生成的 SQL 底部添加一行标记。

我在想,如果我可以提取生成的 SQL,我可以在我需要的 having 子句上添加标签,然后我可以通过 Nhibernate SQLQueryCriteria 提交整个事情。

我知道这并不理想,但这对我来说似乎比使用 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 回答