有关使用NHibernate CreateSQLQuery的建议是什么?

时间:2011-02-23 16:04:02

标签: sql nhibernate

我的直觉告诉我,高级NHibernate用户会反对它,我一直在寻找对此的实际分析并且一无所获,我希望得到解决这些问题的答案:

使用它的优点/缺点是什么? 是否有任何性能影响,无论好坏(例如,使用它来调用存储过程?) 我们应该在哪些情况下使用/避免它? 谁应该使用/避免它?

基本上,使用/避免它的原因是什么?为什么?

2 个答案:

答案 0 :(得分:7)

CreateSQLQuery存在的原因是执行以下任一查询:

  • 不支持
  • 很难写

使用任何其他方法。

当然,这通常是最后的选择,因为:

  • 它不是面向对象的(即你重新考虑表和列而不是实体,属性和关系)
  • 它将您与物理模型联系起来
  • 它将您绑定到特定的RDBMS
  • 它通常会强迫您做更多工作以检索实体
  • 它不会自动支持分页等功能

但如果您认为特定查询需要它,请继续。确保首先学习所有其他方法(HQL,Linq,QueryOver,Criteria和Get)以避免做不必要的工作。

答案 1 :(得分:2)

避免使用SQL并使用HQL的主要原因之一是避免使代码库依赖于RDBMS类型(例如MySQL,Oracle)。另一个原因是您必须使代码依赖于表名和列名,而不是实体名称和属性。

如果您正在将原始SQL与使用NHibernate LINQ提供程序进行比较,那么还有其他令人信服的理由可以使用LINQ查询(当它工作时),例如类型安全性以及能够使用VS引用搜索来确定哪些查询确定表或列被引用。

我的观点是CreateSQLQuery()是一个“最后的出路”选项。它存在是因为有些东西你不能用其他NHibernate API做,但应该避免它,因为它或多或少违背了首先使用NHibernate的整个想法。