📜  NHibernate-条件查询

📅  最后修改于: 2020-11-19 05:43:16             🧑  作者: Mango


在本章中,我们将介绍标准查询机制。通过NHibernate按条件查询API ,您可以在运行时通过处理条件对象来构建查询。

  • 这种方法使您无需直接进行字符串操作即可动态指定约束,但是它不会损失HQL的灵活性或功能。

  • 另一方面,表达为标准的查询通常比HQL表达的查询可读性差。

  • 经典标准语法是基于对象的查询API,如以下程序所示。

var customers = session.CreateCriteria().Add(Restrictions.Like("FirstName", "H%"));
  • 如您所见,我们正在为客户执行会话创建条件,现在我们正在向该查询添加限制对象。

  • 这对查询页面很有用,用户可以在其中选择某些选项,而不能选择其他选项。

  • 将查询构建为类似于查询结构的树形结构比在HQL或LINQ中更容易,在HQL或LINQ中,您可以在WHERE子句中使用AND或OR。

  • 仅使用这些条件对象添加其他限制会更容易。

让我们看一个简单的示例,在该示例中,我们将创建一个查询并通过createCriteria获取对标准API的访问权限,然后添加一个以H开头的限制。

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.CreateCriteria() 
               .Add(Restrictions.Like("FirstName", "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; 
      } 
   } 
}

编译并执行上述代码后,您将看到以下输出。

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-6cf049ee52be

Hudson 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-6cf049ee52be

Hettie 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-6cf049ee52be
        
Press  to exit…

让我们看另一个简单的示例,在该示例中,我们将检索名字等于“ Laverne”的客户

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.CreateCriteria() 
               .Add(Restrictions.Eq("FirstName", "Laverne")) .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; 
      } 
   } 
}

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

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-6cf049ee52be
        
Press  to exit...

现在,标准API的主要缺点之一是属性名称中的这些不透明字符串。因此,如果将名字重构为其他名称,则重构工具不一定会选择不透明的字符串。