Nhibernate-hibernate-query-language

提供:Dev Guides
移動先:案内検索

NHibernate-Hibernateクエリ言語

この章では、Hibernate Query Languageについて説明します。 HQLは、JavaのHibernateとNHibernateの両方で共有されます。

  • これは Criteria とともに最も古いクエリメカニズムです。
  • それは非常に早く実装され、文字列ベースのクエリ API です。
  • ISession CreateQuery を介してアクセスします。これは、SQLとほぼ同じです。
  • 同じキーワードの多くを使用しますが、構文は単純化されています。
  • これは最も一般的な例の1つです。クエリの実行方法を探している場合、HQLの例がよく見られます。

以下はHQLの簡単な例です-

var customers = session.CreateQuery("select c from Customer c where c.FirstName = 'Laverne'");
  • ここで、顧客からCを選択していることがわかります。SQLによく似ています。 これはNHibernateに関する限り不透明な文字列なので、これが実行時まで有効なHQLであるかどうかはわかりませんが、これは欠点の1つです。
  • LINQプロバイダーの強みの1つは、コンパイル時のサポートを取得できることです。 *しかし、HQLは、頻繁に使用される最も柔軟なクエリメカニズムの1つです。 他に方法がない場合は、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<Customer>()) {
               Console.WriteLine(customer);
            }

            tx.Commit();
         }

         Console.WriteLine("Press <ENTER> to exit...");
         Console.ReadLine();
      }

      private static Configuration ConfigureNHibernate() {

         NHibernateProfiler.Initialize();
         var cfg = new Configuration();

         cfg.DataBaseIntegration(x => {
            x.ConnectionStringName = "default";
            x.Driver<SqlClientDriver>();
            x.Dialect<MsSql2008Dialect>();
            x.IsolationLevel = IsolationLevel.RepeatableRead;
            x.Timeout = 10;
            x.BatchSize = 10;
         });

         cfg.SessionFactory().GenerateStatistics();
         cfg.AddAssembly(Assembly.GetExecutingAssembly());
         return cfg;
      }
   }
}
  • このHQL文字列はSQLによく似ていますが、主な違いはFirstNameが列名ではなくプロパティ名であることです。
  • したがって、2つの間に矛盾がある場合は、プロパティ名を使用します。 同じことは、テーブル名のように見えますが、実際には、選択するクラスの名前です。
  • バックエンドテーブルの名前がCustomersである場合、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-6cf049ee52be

Press <ENTER> to exit...

HQLを使用してFirstNameが文字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.CreateQuery("select c from Customer c
               where c.FirstName like 'H%'");

            foreach (var customer in customers.List<Customer>()) {
               Console.WriteLine(customer);
            }

            tx.Commit();
         }

         Console.WriteLine("Press <ENTER> to exit...");
         Console.ReadLine();
      }

      private static Configuration ConfigureNHibernate() {

         NHibernateProfiler.Initialize();
         var cfg = new Configuration();

         cfg.DataBaseIntegration(x => {
            x.ConnectionStringName = "default";
            x.Driver<SqlClientDriver>();
            x.Dialect<MsSql2008Dialect>();
            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-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 <ENTER> to exit...

注文数が9を超える顧客すべての注文が必要になるなど、より複雑なことを行うことができます。 以下は同じものに対するHQLクエリです。

var customers = session.CreateQuery("select c from Customer c
   where size(c.Orders) > 9");

foreach (var customer in customers.List<Customer>()) {
   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<Customer>()) {
   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-6cf049ee52be

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

Press <ENTER> to exit...

9件以上の注文があるすべての顧客がデータベースから取得されていることがわかります。