【问题标题】:Catching the NHibernate generated SQL and amending before running捕获 NHibernate 生成的 SQL 并在运行前进行修改
【发布时间】:2011-12-18 22:07:26
【问题描述】:

是否可以在不实际运行的情况下获得将由 nhibernate 在您的代码中创建的 sql?

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

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

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

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

我在想,如果我可以提取生成的 SQL,我可以标记我需要的 having 子句,然后我可以通过 Nhibernate SQLQueryCriteria 提交整个内容。

我知道这并不理想,但这对我来说似乎比使用 HQL 或 SQL 编写的一个查询更好,而其余的查询共享一个共同的标准库。

这可能吗?这是个好主意吗?任何替代方案也将受到欢迎。

【问题讨论】:

标签: nhibernate nhibernate-criteria


【解决方案1】:

在上面评论中提到的帖子中,我发现以下 sn-p 代码效果很好。

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();
    }

【讨论】:

  • 这段代码的问题是它没有将参数嵌入到查询中,你只会看到问号。
猜你喜欢
  • 1970-01-01
  • 2017-05-13
  • 2019-04-11
  • 1970-01-01
  • 2017-06-26
  • 2012-09-20
  • 1970-01-01
  • 2013-07-11
  • 2018-07-17
相关资源
最近更新 更多