开发手册 欢迎您!
软件开发者资料库

NHibernate - Native Sql

NHibernate Native Sql - 从概述,架构,Orm,环境设置,入门,基本Orm,基本Crud操作,Profiler,添加Intelliesnse到映射文件,数据类型映射,配置,覆盖配置,批量大小,缓存,映射开始学习NHibernate组件,关系,集合映射,级联,延迟加载,反向关系,加载/获取,Linq,Hibernate查询语言,条件查询,QueryOver查询,本机Sql,流利Hibernate。

在本章中,我们将介绍如何在NHibernate中使用本机SQL查询.如果你多年来一直使用手写SQL,你可能会担心ORM会带走你习惯的一些表现力和灵活性.

  • NHibernate强大的查询工具几乎可以让您在SQL中做任何事情,在某些情况下还可以做更多.

  • 极少数情况下,你无法使NHibernate自己的查询工具完全符合你的要求.

  • NHibernate允许你使用数据库的本机SQL方言检索对象./p>

让我们看看NHibernate中一个简单的Native SQL查询示例.

using System; using System.Data; using System.Linq; using System.Reflection; using HibernatingRhinos.Profiler.Appender.NHibernate; using NHibernate.Cfg; using NHibernate.Criterion; using NHibernate.Dialect; using NHibernate.Driver; using NHibernate.Linq; using NHibernate;namespace NHibernateDemo {   internal class Program {       private static void Main() {          var cfg = ConfigureNHibernate();          var sessionFactory = cfg.BuildSessionFactory();         using(var session = sessionFactory.OpenSession())                   using(var tx = session.BeginTransaction()) {            IQuery sqlQuery = session.CreateSQLQuery("SELECT * FROM               CUSTOMER").AddEntity(typeof(Customer));            var customers = sqlQuery.List();            foreach (var customer in customers) {                Console.WriteLine(customer);             }             tx.Commit();          }                  Console.WriteLine("Press  to exit...");          Console.ReadLine();       }      private static Configuration ConfigureNHibernate() {          NHibernateProfiler.Initialize();          var cfg = new Configuration();                   cfg.DataBaseIntegration(x => {             x.ConnectionStringName = "default";             x.Driver();             x.Dialect();             x.IsolationLevel = IsolationLevel.RepeatableRead;             x.Timeout = 10;             x.BatchSize = 10;          });                   cfg.SessionFactory().GenerateStatistics();         cfg.AddAssembly(Assembly.GetExecutingAssembly());          return cfg;       }    } }

上面的例子使用 CreateSQLQuery()来取回一个对象列表,您还会注意到您希望查询返回的根实体类型被指定为Customer.

让我们运行您的应用程序,您将看到所有客户都是从数据库中检索.

Emerson Prosacco (4ec2a0e0-6bce-11e1-b2cf-6cf049ee52be)   Points: 17   HasGoldStatus: False   MemberSince: 6/22/2007 12:00:00 AM (Utc)   CreditRating: Excellent   AverageRating: 0   Orders:      Order Id: 4ec2a0e0-6bce-11e1-b2d0-6cf049ee52be      Order Id: 4ec2a0e0-6bce-11e1-b2d1-6cf049ee52be      Order Id: 4ec2a0e0-6bce-11e1-b2d2-6cf049ee52be      Order Id: 4ec2a0e0-6bce-11e1-b2d3-6cf049ee52be      Order Id: 4ec2a0e0-6bce-11e1-b2d4-6cf049ee52beKaci Friesen (4ec2a0e0-6bce-11e1-b2d5-6cf049ee52be)   Points: 30   HasGoldStatus: True   MemberSince: 5/25/2007 12:00:00 AM (Utc)   CreditRating: VeryVeryGood   AverageRating: 0   Orders:      Order Id: 4ec2a0e0-6bce-11e1-b2d6-6cf049ee52be      Order Id: 4ec2a0e0-6bce-11e1-b2d7-6cf049ee52be      Order Id: 4ec2a0e0-6bce-11e1-b2d8-6cf049ee52be      Order Id: 4ec2a0e0-6bce-11e1-b2d9-6cf049ee52be      Order Id: 4ec2a0e0-6bce-11e1-b2da-6cf049ee52be      Order Id: 4ec2a0e0-6bce-11e1-b2db-6cf049ee52beEveline Waters (4ec2a0e0-6bce-11e1-b2dc-6cf049ee52be)   Points: 58   HasGoldStatus: False   MemberSince: 10/29/2009 12:00:00 AM (Utc)   CreditRating: Good   AverageRating: 0   Orders:      Order Id: 4ec2a0e0-6bce-11e1-b2dd-6cf049ee52be      Order Id: 4ec2a0e0-6bce-11e1-b2de-6cf049ee52be      Order Id: 4ec2a0e0-6bce-11e1-b2df-6cf049ee52be      Order Id: 4ec2a0e0-6bce-11e1-b2e0-6cf049ee52be      Order Id: 4ec2a0e0-6bce-11e1-b2e2-6cf049ee52beMolly Kuhn (4ec2a0e0-6bce-11e1-b2e3-6cf049ee52be)   Points: 73   HasGoldStatus: False   MemberSince: 12/16/2007 12:00:00 AM (Utc)   CreditRating: VeryGood   AverageRating: 0   Orders:      Order Id: 4ec2a0e0-6bce-11e1-b2e4-6cf049ee52be      Order Id: 4ec2a0e0-6bce-11e1-b2e5-6cf049ee52be      Order Id: 4ec2a0e0-6bce-11e1-b2e6-6cf049ee52be      Order Id: 4ec2a0e0-6bce-11e1-b2e7-6cf049ee52be      Order Id: 4ec2a0e0-6bce-11e1-b2e8-6cf049ee52be      Order Id: 4ec2a0e0-6bce-11e1-b2e9-6cf049ee52be      Order Id: 4ec2a0e0-6bce-11e1-b2ea-6cf049ee52be      Order Id: 4ec2a0e0-6bce-11e1-b2eb-6cf049ee52be      Order Id: 4ec2a0e0-6bce-11e1-b2ec-6cf049ee52be

下面是编写本机SQL查询的另一种方法,如下所示.

IList customers = session.CreateSQLQuery("SELECT * FROM CUSTOMER")   .AddScalar("Id", NHibernateUtil.Guid)    .AddScalar("FirstName", NHibernateUtil.String)    .AddScalar("LastName", NHibernateUtil.String) .List();

  • 正如您所看到的,上面的查询指定了SQL查询字符串以及列和要返回的类型.

  • 这将返回一个IList的Object数组,其中包含Customer表中每列的标量值.

  • 只返回这三列,即使查询使用*并且可以返回超过列出的三列.

让我们来看看另一个简单的例子.

IList customers = session.CreateSQLQuery("SELECT * FROM CUSTOMER WHERE     FirstName = 'Laverne'")    .AddEntity(typeof(Customer)) .List(); foreach (var customer in customers) {    Console.WriteLine(customer);  }

让我们再次运行您的应用程序,您将看到以下输出.

Laverne Hegmann (4e97c816-6bce-11e1-b095-6cf049ee52be)   Points: 74   HasGoldStatus: True   MemberSince: 4/4/2009 12:00:00 AM (Utc)   CreditRating: Neutral   AverageRating: 0   Orders:      Order Id: 4ea14d96-6bce-11e1-b095-6cf049ee52be      Order Id: 4ea14d96-6bce-11e1-b096-6cf049ee52be      Order Id: 4ea14d96-6bce-11e1-b097-6cf049ee52be      Order Id: 4ea14d96-6bce-11e1-b098-6cf049ee52bePress  to exit...

同样,您可以指定任何类型的SQL查询来从数据库中检索数据.