NHibernate在CreateSql和CreateCriteria之间选择问题

问题描述

|| 我对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来解决。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...