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

关于使用NHibernate CreateSQLQuery的建议是什么?,sql,nhibernate,Sql,Nhibernate,我的直觉告诉我,高级NHibernate用户会反对它,我一直在寻找对此的实际分析,但没有发现任何结果,我想找到解决这些问题的答案: 使用它的优点/缺点是什么? 是否存在任何性能影响,无论是好的还是坏的(例如,使用它调用存储过程?) 在哪些情况下我们应该使用/避免它? 谁应该使用/避免它 基本上,使用/避免它的原因是什么?为什么?避免使用SQL和HQL的主要原因之一是避免使代码库依赖于RDBMS类型(例如MySQL、Oracle)。另一个原因是,您必须使代码依赖于表名和列名,而不是实体名和属性 如

我的直觉告诉我,高级NHibernate用户会反对它,我一直在寻找对此的实际分析,但没有发现任何结果,我想找到解决这些问题的答案:

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


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

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

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


我的观点是CreateSQLQuery()是一个“最后的出路”选项。它之所以存在,是因为有些事情您无法使用其他NHibernate API,但应该避免,因为它或多或少违背了最初使用NHibernate的整个想法

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

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


我的观点是CreateSQLQuery()是一个“最后的出路”选项。它之所以存在,是因为有些事情您无法使用其他NHibernate API,但应该避免,因为它或多或少违背了最初使用NHibernate的整个想法

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

  • 不支持
  • 难写
使用任何其他方法

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

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

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

CreateSQLQuery的存在是有原因的,这就是执行以下查询:

  • 不支持
  • 难写
使用任何其他方法

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

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

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

我预计会有最坏的缺点,我的意思是,即使这是最后一个选项,看起来也没有那么糟糕,性能如何?不应该有任何明显的区别。我预计会有最坏的缺点,我的意思是,即使它是最后一个选项,看起来也没有那么糟糕,性能呢?应该没有任何明显的区别。