当 CacheMode=Ignore 时,为啥 NHibernate.ISession.CreateQuery 会返回与 CreateSQLQuery 不同的东西?

Posted

技术标签:

【中文标题】当 CacheMode=Ignore 时,为啥 NHibernate.ISession.CreateQuery 会返回与 CreateSQLQuery 不同的东西?【英文标题】:Why would NHibernate.ISession.CreateQuery return something different from CreateSQLQuery when CacheMode=Ignore?当 CacheMode=Ignore 时,为什么 NHibernate.ISession.CreateQuery 会返回与 CreateSQLQuery 不同的东西? 【发布时间】:2011-12-09 18:01:33 【问题描述】:

这是一个非常简单的问题,但我对此感到困惑。在 Visual Studio 的即时窗口中,我看到了这个:

session.CacheMode
Ignore

session.CreateQuery("SELECT COUNT(*) FROM Protein").List()
Count = 1
    [0]: 0

session.CreateSQLQuery("SELECT COUNT(*) FROM Protein").List()
Count = 1
    [0]: 6

【问题讨论】:

【参考方案1】:

这种情况可能有多种原因,请检查您的映射以了解以下情况:

带有where 过滤器的<class> 映射。 带有force="true" 属性的<discriminator><join> 映射在一侧不匹配且未指定为 optional="true"。 实体的自定义<loader query-ref="...">。 已通过session.EnableFilter 启用的实体上的<filter>Protein 类未映射到 Protein 表。 您可以在不同的架构中有 2 个名为 Protein 的表,因此 NHibernate 正在查询 foo.Protein,但您的 sql 正在查询 dbo.Protein

之后它开始变得更加深奥,例如使用自定义方言、实体元组等。

查看正在发生的事情的一种简单方法是查看正在发出的 SQL,您可以通过以下方式执行此操作:

设置<property name="show_sql" value="true"/> 并观察控制台/记录器。 为您的服务器使用分析工具(例如用于 MSSQL 的 SQL Server Profiler)。 使用NHibernate Profiler

【讨论】:

连接映射不是可选的。我没有意识到可选是内连接和左外连接之间的区别。我什至阅读了上面的文档,但不理解“将始终使用外部连接来检索属性”。谢谢!

以上是关于当 CacheMode=Ignore 时,为啥 NHibernate.ISession.CreateQuery 会返回与 CreateSQLQuery 不同的东西?的主要内容,如果未能解决你的问题,请参考以下文章

为啥“grep --ignore-case”慢了 50 倍?

何时以及为啥需要在 C++ 中使用 cin.ignore()?

jquery.validate 当验证正确之后为啥错误信息没有移除?

为啥outlook总是脱机状态

为啥当我单击 Ctrl+Shift+N 时 resharper 无法打开文件?

从命令行运行脚本时忽略 sklearn Gridsearch 中 n_jobs = -1 的警告不使用 warnings.simplefilter('ignore')