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

NHibernate - Hibernate查询语言

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

在本章中,我们将介绍Hibernate查询语言. HQL在Java的Hibernate和NHibernate中共享.

  • 这是最早的查询机制以及 Criteria .

  • 它很早就实现了,它是一个基于字符串的查询 API .

  • 您可以通过 ISession CreateQuery 访问它,它几乎与SQL类似.

  • 它使用了许多相同的关键字,但语法简化.

  • 这是最常见的例子之一,如果你正在寻找如何执行查询,你经常会找到HQL示例.

以下是HQL的简单示例 :

var customers = session.CreateQuery("select c from Customer c where c.FirstName = 'Laverne'");

  • 所以在这里你可以看到他们从客户那里选择C,它看起来很像SQL.就NHibernate而言,这是一个不透明的字符串,所以你不知道这是否是一个有效的HQL,直到运行时,这是一个缺点.

  • LINQ提供程序的一个优点是你可以获得编译时支持.

  • 但是HQL是经常使用的最灵活的查询机制之一.据说,如果没有其他方法可以做到这一点,那么有一种方法可以在HQL中进行.

我们来看看在一个简单的示例中,我们将使用HQL重新创建LINQ查询.您可以通过调用 session.CreateQuery 来访问HQL,并使用HQL字符串作为参数传递.

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;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()) {             var customers = session.CreateQuery("select c from Customer c                where c.FirstName = 'Laverne'");                         foreach (var customer in customers.List()) {                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;       }    } }

  • 这个HQL string看起来很像SQL,主要区别在于FirstName是属性名而不是列名.

  • 所以,如果两者之间存在差异,您使用属性名称.同样的,它看起来像一个表名,但它实际上是我们选择的类的名称.

  • 如果后端表被命名为客户,我们仍然会在HQL查询中使用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...

让我们看看另一个简单的例子,我们将使用HQL检索FirstName以字母H开头的所有客户./p>

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; 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()) {             var customers = session.CreateQuery("select c from Customer c                where c.FirstName like 'H%'");                         foreach (var customer in customers.List()) {                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;       }    } }

让我们再次运行您的应用程序,您将看到所有名称开始的客户从这个查询返回H.

Herman Crooks (4ead3480-6bce-11e1-b15c-6cf049ee52be)   Points: 74   HasGoldStatus: True   MemberSince: 12/3/2010 12:00:00 AM (Utc)   CreditRating: Neutral   AverageRating: 0   Orders:      Order Id: 4ead3480-6bce-11e1-b15d-6cf049ee52be      Order Id: 4ead3480-6bce-11e1-b15e-6cf049ee52be      Order Id: 4ead3480-6bce-11e1-b15f-6cf049ee52be      Order Id: 4ead3480-6bce-11e1-b160-6cf049ee52be      Order Id: 4ead3480-6bce-11e1-b161-6cf049ee52be      Order Id: 4ead3480-6bce-11e1-b162-6cf049ee52be      Order Id: 4ead3480-6bce-11e1-b163-6cf049ee52beHudson Bins (4ec03f80-6bce-11e1-b2b7-6cf049ee52be)   Points: 56   HasGoldStatus: False   MemberSince: 10/20/2008 12:00:00 AM (Utc)   CreditRating: Terrible   AverageRating: 0   Orders:      Order Id: 4ec03f80-6bce-11e1-b2b8-6cf049ee52be      Order Id: 4ec03f80-6bce-11e1-b2b9-6cf049ee52be      Order Id: 4ec03f80-6bce-11e1-b2ba-6cf049ee52be      Order Id: 4ec03f80-6bce-11e1-b2bb-6cf049ee52be      Order Id: 4ec03f80-6bce-11e1-b2bc-6cf049ee52be      Order Id: 4ec03f80-6bce-11e1-b2bd-6cf049ee52be      Order Id: 4ec03f80-6bce-11e1-b2be-6cf049ee52be      Order Id: 4ec03f80-6bce-11e1-b2bf-6cf049ee52beHettie Feest (4ec50240-6bce-11e1-b300-6cf049ee52be)   Points: 82   HasGoldStatus: False   MemberSince: 4/10/2009 12:00:00 AM (Utc)   CreditRating: Neutral   AverageRating: 0   Orders:      Order Id: 4ec50240-6bce-11e1-b301-6cf049ee52be      Order Id: 4ec50240-6bce-11e1-b302-6cf049ee52be      Order Id: 4ec50240-6bce-11e1-b303-6cf049ee52bePress  to exit...

我们可以做更复杂的事情,比如想要订单数量大于9的客户的所有订单.以下是HQL查询同样.

var customers = session.CreateQuery("select c from Customer c    where size(c.Orders) > 9"); foreach (var customer in customers.List()) {    Console.WriteLine(customer); }

我们还需要表明我们需要这里的尺寸或数量或长度.在HQL中,我们可以选择使用如上所示的特殊大小方法.

如果您愿意,另一种写入方式是 c.Orders.size ,这具有确切的效果.

var customers = session.CreateQuery("select c from Customer c    where c.Orders.size > 9"); foreach (var customer in customers.List()) {    Console.WriteLine(customer);  }

让我们运行这个应用程序.

Lindsay Towne (4ea3aef6-6bce-11e1-b0cb-6cf049ee52be)   Points: 50   HasGoldStatus: False   MemberSince: 4/13/2007 12:00:00 AM (Utc)   CreditRating: VeryGood   AverageRating: 0   Orders:      Order Id: 4ea3aef6-6bce-11e1-b0cc-6cf049ee52be      Order Id: 4ea3aef6-6bce-11e1-b0cd-6cf049ee52be      Order Id: 4ea3aef6-6bce-11e1-b0ce-6cf049ee52be      Order Id: 4ea3aef6-6bce-11e1-b0cf-6cf049ee52be      Order Id: 4ea3aef6-6bce-11e1-b0d0-6cf049ee52be      Order Id: 4ea3aef6-6bce-11e1-b0d1-6cf049ee52be      Order Id: 4ea3aef6-6bce-11e1-b0d2-6cf049ee52be      Order Id: 4ea3aef6-6bce-11e1-b0d3-6cf049ee52be      Order Id: 4ea3aef6-6bce-11e1-b0d4-6cf049ee52be      Order Id: 4ea3aef6-6bce-11e1-b0d5-6cf049ee52beWyman Hammes (4ea61056-6bce-11e1-b0e2-6cf049ee52be)   Points: 32   HasGoldStatus: False   MemberSince: 2/5/2011 12:00:00 AM (Utc)   CreditRating: Good   AverageRating: 0   Orders:      Order Id: 4ea61056-6bce-11e1-b0e3-6cf049ee52be      Order Id: 4ea61056-6bce-11e1-b0e4-6cf049ee52be      Order Id: 4ea61056-6bce-11e1-b0e5-6cf049ee52be      Order Id: 4ea61056-6bce-11e1-b0e6-6cf049ee52be      Order Id: 4ea61056-6bce-11e1-b0e7-6cf049ee52be      Order Id: 4ea61056-6bce-11e1-b0e8-6cf049ee52be      Order Id: 4ea61056-6bce-11e1-b0e9-6cf049ee52be      Order Id: 4ea61056-6bce-11e1-b0ea-6cf049ee52be      Order Id: 4ea61056-6bce-11e1-b0eb-6cf049ee52be      Order Id: 4ea61056-6bce-11e1-b0ec-6cf049ee52bePress  to exit...

您可以看到从数据库中检索到超过9个订单的所有客户.