NHibernate - แบบสอบถามเกณฑ์
ในบทนี้เราจะกล่าวถึงกลไกการสืบค้นเกณฑ์ NHibernate Query by Criteria API ช่วยให้คุณสร้างแบบสอบถามโดยจัดการกับวัตถุเกณฑ์ในขณะรันไทม์
วิธีนี้ช่วยให้คุณระบุข้อ จำกัด แบบไดนามิกโดยไม่ต้องมีการปรับแต่งสตริงโดยตรง แต่จะไม่สูญเสียความยืดหยุ่นหรือพลังของ HQL ไปมากนัก
ในทางกลับกันแบบสอบถามที่แสดงเป็นเกณฑ์มักจะอ่านได้น้อยกว่าแบบสอบถามที่แสดงใน HQL
ไวยากรณ์ของเกณฑ์คลาสสิกคือ API การสืบค้นตามวัตถุดังที่แสดงในโปรแกรมต่อไปนี้
var customers = session.CreateCriteria<Customer>().Add(Restrictions.Like("FirstName", "H%"));
อย่างที่คุณเห็นเรากำลังทำเซสชันสร้างเกณฑ์สำหรับลูกค้าและตอนนี้เรากำลังเพิ่มวัตถุข้อ จำกัด ในการสืบค้นนั้น
สิ่งนี้มีประโยชน์สำหรับหน้าแบบสอบถามที่ผู้ใช้สามารถเลือกตัวเลือกบางอย่าง แต่ไม่สามารถเลือกตัวเลือกอื่นได้
ง่ายกว่าที่จะสร้างแบบสอบถามเป็นประเภทของต้นไม้เช่นโครงสร้างแบบสอบถามแทนที่จะเป็นใน HQL หรือ LINQ ซึ่งคุณสามารถใช้คำสั่ง AND หรือ OR ในส่วนคำสั่ง WHERE ได้
ง่ายกว่าเพียงเพิ่มข้อ จำกัด เพิ่มเติมโดยใช้วัตถุเกณฑ์เหล่านี้
มาดูตัวอย่างง่ายๆที่เราจะสร้างแบบสอบถามและเข้าถึงเกณฑ์ API ผ่าน createCriteria จากนั้นเพิ่มข้อ จำกัด ที่ชื่อเริ่มต้นด้วย 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<Customer>()
.Add(Restrictions.Like("FirstName", "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;
}
}
}
เมื่อโค้ดด้านบนถูกคอมไพล์และดำเนินการคุณจะเห็นผลลัพธ์ต่อไปนี้
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…
มาดูตัวอย่างง่ายๆอีกตัวอย่างหนึ่งซึ่งเราจะดึงข้อมูลลูกค้าที่มีชื่อเท่ากับ "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<Customer>()
.Add(Restrictions.Eq("FirstName", "Laverne")) .List<Customer>();
foreach (var customer in customers) {
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;
}
}
}
ลองเรียกใช้แอปพลิเคชันนี้อีกครั้งและคุณจะเห็นผลลัพธ์ต่อไปนี้
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...
ตอนนี้หนึ่งในข้อเสียที่สำคัญของเกณฑ์ API คือสตริงทึบแสงเหล่านี้ในชื่อคุณสมบัติ ดังนั้นหากชื่อแรกถูก refactored เป็นอย่างอื่นเครื่องมือ refactoring ก็ไม่จำเป็นต้องเลือกสตริงทึบแสง