在CreateSql和CreateCriteria之间选择NHibernate问题

时间:2011-05-26 09:53:06

标签: nhibernate criteria

我对NHibernate有一个非常愚蠢的怀疑。有两个或三个实体,其中两个相关,一个与其他两个实体无关。我必须通过加入它们从这三个表中获取一些选定的列。使用session.CreateSql()或者我们必须使用session.CreateCriteria()是个好主意。我真的很困惑,因为我无法在这里编写Criteria查询并强制使用CreateSql。请指教。

2 个答案:

答案 0 :(得分:0)

一般情况下,应尽可能避免编写SQL;
使用ORM的一个优点是它与实现无关 这意味着您不知道(并且不关心)底层数据库是什么,并且您可以非常轻松地切换数据库提供程序或使用数据库结构进行调整。
如果您编写自己的SQL语句,则存在不在其他提供程序上工作的风险,并且您还必须自己维护它们(例如,如果您将Id属性的基础列的名称从“Id”更改为“ Employee_Id',你必须改变你的SQL查询,而使用Criteria则不需要改变)。

话虽如此 - 没有什么可以阻止你编写从多个表中提取数据的Criteria / HQL。例如(使用HQL):

select emp.Id, dep.Name, po.Id  
from Employee emp, Department dep, Posts po
where emp.Name like 'snake' //etc...

答案 1 :(得分:0)

有多种方法可以使用NH进行查询。

  • HQL ,经典的方式,强大的面向对象的查询语言。缺点:出现在代码中的字符串中(实际上:没有编辑器支持)。
  • 标准,这是一种在没有字符串操作的情况下创建动态查询的经典方法。缺点:没有HQL那么强大,也不像后续版本那样安全。
  • QueryOver ,Criteria的继承者,语法更好,更安全。
  • LINQ ,现在基于HQL,比HQL和类型安全更加集成,通常是一种品味。
  • SQL 作为您需要某些无法获得面向对象方式的情况的后备。

我建议使用HQL或LINQ进行常规查询,使用QueryOver(resp.Friteria)进行动态查询,只有在没有任何其他方式时才使用SQL。

要回答您不知道的具体问题:如果面向对象模型中提供了查询所需的所有信息,您应该能够通过使用 HQL