DBアクセス
接続確認
簡単な検索(全件検索、Idによる検索)を行うコードを用いて、NHibernateで用意されているクエリ機能(HQL、Criteria、Native SQL)を試します。ベースとなるコード(C#)は以下になります(各DBMS用NHibernateコンフィグファイルについては、「おまけ」の節に掲載します)。
[Productsテーブルの全件取得(Idの昇順)]
using System;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Criterion;
using NHibernateExample;
namespace NHibernateExample.Test
{
public class Query1
{
public static void Main(string[] args)
{
string s;
string cfg_prefix;
// 接続先DBMSの選択
START:
Console.Write("Connect to\n1:SQLite\n2:PostgreSQL\n3:MySQL\n4:SQLServer\n5:Oracle\n6:Firebird\n7:DB2\n?> ");
s = Console.ReadLine();
switch(s)
{
case "1": cfg_prefix = "SQLite"; break; // SQLite
case "2": cfg_prefix = "PostgreSQL"; break; // PostgreSQL
case "3": cfg_prefix = "MySQL"; break; // MySQL
case "4": cfg_prefix = "SQLServer"; break; // SQL Server
case "5": cfg_prefix = "Oracle"; break; // Oracle
case "6": cfg_prefix = "Firebird"; break; // Firebird
case "7": cfg_prefix = "DB2"; break; // DB2
default: goto START;
}
Configuration cfg = new Configuration();
cfg.Configure(cfg_prefix + ".cfg.xml");
ISessionFactory factory = cfg.BuildSessionFactory();
using (ISession session = factory.OpenSession())
{
// Productsテーブルの全件取得(Idの昇順)
#region Query
// HQL
var results = session.CreateQuery(
"from Product as p order by p.Id asc")
.List();
#endregion
foreach (Product p in results)
{
Console.WriteLine(p);
}
}
}
}
}
/*
* ビルド:
*
* gmcs -r:NHibernate.dll,NHibernateExample.dll query1.cs
*
* 実行:
*
* mono query1.exe
*
*/
[ProductsテーブルのIdによる検索]
using System;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Criterion;
using NHibernateExample;
namespace NHibernateExample.Test
{
public class Query2
{
public static void Main(string[] args)
{
string s;
string cfg_prefix;
string i;
int id;
// 接続先DBMSの選択
START:
Console.Write("Connect to\n1:SQLite\n2:PostgreSQL\n3:MySQL\n4:SQLServer\n5:Oracle\n6:Firebird\n7:DB2\n?> ");
s = Console.ReadLine();
switch(s)
{
case "1": cfg_prefix = "SQLite"; break; // SQLite
case "2": cfg_prefix = "PostgreSQL"; break; // PostgreSQL
case "3": cfg_prefix = "MySQL"; break; // MySQL
case "4": cfg_prefix = "SQLServer"; break; // SQL Server
case "5": cfg_prefix = "Oracle"; break; // Oracle
case "6": cfg_prefix = "Firebird"; break; // Firebird
case "7": cfg_prefix = "DB2"; break; // DB2
default: goto START;
}
Console.Write("ID?> ");
i = Console.ReadLine();
if (!(Int32.TryParse(i, out id)))
{
Console.WriteLine("整数値を入力して下さい。入力値 = {0}", i);
return;
}
Configuration cfg = new Configuration();
cfg.Configure(cfg_prefix + ".cfg.xml");
ISessionFactory factory = cfg.BuildSessionFactory();
using (ISession session = factory.OpenSession())
{
// ProductsテーブルのIdによる検索
#region Query
// HQL
var result = session.CreateQuery(
"from Product as p where p.Id = :id")
.SetParameter("id", id)
.UniqueResult<Product>();
#endregion
if (result != null)
{
Console.WriteLine("FOUND!:{0}", result);
}
}
}
}
}
/*
* ビルド:
*
* gmcs -r:NHibernate.dll,NHibernateExample.dll query2.cs
*
* 実行:
*
* mono query2.exe
*
*/
HQL
HQL(Hibernate Query Language)はNHibernateで用意されているSQLライクなクエリ言語です。NHibernateで用意されている各クエリは、SQLに変換されるので、コンフィグファイルで次の設定をした場合、
<property name="show_sql">true</property>HQLが次のようにSQLに変換されるのが分かります。
[Productsテーブルの全件取得(Idの昇順)]
NHibernate: SELECT this_.ProductID as ProductID0_0_, this_.ProductName as ProductN2_0_0_, this_.Price as Price0_0_, this_.ProductDescription as ProductD4_0_0_ FROM Products this_ ORDER BY this_.ProductID asc
[ProductsテーブルのIdによる検索]
NHibernate: select product0_.ProductID as ProductID0_, product0_.ProductName as ProductN2_0_, product0_.Price as Price0_, product0_.ProductDescription as ProductD4_0_ from Products product0_ where (product0_.ProductID=@p0 ); @p0 = '1'
また、HQLではありませんが、「Idによる検索」の様な、PRIMARY KEYによる検索の場合、次の記述が可能です。
[ProductsテーブルのIdによる検索]
var result = session.Get<Product>(id);
Criteria
HQLを次のCriteriaに置き換え可能です。[Productsテーブルの全件取得(Idの昇順)]
// Criteria
var results = session.CreateCriteria(typeof(Product))
.AddOrder(Order.Asc("Id"))
.List();
[ProductsテーブルのIdによる検索]
// Criteria
var result = session.CreateCriteria(typeof(Product))
.Add(Expression.Eq("Id", id))
.UniqueResult<Product>();
CriteriaはHQLより簡易なクエリ機能と位置づけられているようです。Native SQL
HQLを次のNative SQLに置き換え可能です。[Productsテーブルの全件取得(Idの昇順)]
// Native SQL var results = session.CreateSQLQuery( "SELECT * FROM Products ORDER BY ProductID") .AddEntity(typeof(Product)) .List();
[ProductsテーブルのIdによる検索]
// Native SQL
var result = session.CreateSQLQuery(
"SELECT * FROM Products WHERE ProductID = :id")
.AddEntity(typeof(Product))
.SetParameter("id", id)
.UniqueResult<Product>();
上記の様に、直接SQL文を記述することが可能です。Monoで他のDBも使ってみたよ!+(db4o、NHibernate編)6 へ続く。


0 件のコメント:
コメントを投稿