问题描述
||
我对NHibernate有一个非常愚蠢的疑问。有两个或三个实体,其中两个相关,一个与其他两个实体无关。我必须通过加入这三个表来获取一些选定的列。使用session.CreateSql()是一个好主意还是我们必须使用session.CreateCriteria()。我在这里真的很困惑,因为我无法在此处编写Criteria查询并被迫使用CreateSql。请指教。
解决方法
通常,应尽可能避免编写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...
,使用NH进行查询有多种方法。
HQL是一种经典的方式,是一种功能强大的面向对象的查询语言。缺点:出现在代码的字符串中(实际上:不支持编辑器)。
Criteria,一种无需字符串操作即可创建动态查询的经典方法。缺点:不如HQL强大,也不如其后继类型安全。
QueryOver,Criteria的后继者,它的语法更好,而且类型安全性更高。
现在基于HQL的LINQ与HQL和类型安全性相比集成度更高,并且通常只涉及口味。
在需要某些无法获得面向对象方式的情况下,将SQL作为备用。
如果没有其他方法,我建议对常规查询使用HQL或LINQ,对动态查询和SQL建议使用QueryOver(即条件)。
要回答您不知道的具体问题,我不知道:如果查询所需的所有信息都在面向对象模型中可用,则应该能够通过使用HQL来解决。