NHibernate - ICriteria 查询

简介:

条件查询

NHibernate.ICriteria接口表示特定持久类的一个查询。ISession是 ICriteria实例的工厂。

这里以Northwind数据库为示例数据库

示例数据表:Employees

现在只用雇员表中部分字段。

持久类如下:

public class Employees

    {

        public virtual int EmployeeID { get; set; }

        public virtual string LastName { get; set; }

        public virtual string FirstName { get; set; }

        public virtual DateTime BirthDate { get; set; }

        public virtual string Address { get; set; }

        public virtual string City { get; set; }

        public virtual string PostalCode { get; set; }

    }

映射文件如下:

<?xml version="1.0" encoding="utf-8" ?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain.Entities">

  <class table="Employees">

    <id column="EmployeeID">

      <generator ></generator>

    </id>

    <property column="LastName" type="String"></property>

    <property column="FirstName" type="String"></property>

    <property column="BirthDate" type="DateTime"></property>

    <property column="Address" type="String"></property>

    <property column="City" type="String"></property>

    <property column="PostalCode" type="String"></property>

  </class>

</hibernate-mapping>

开始

(一) 返回所有实例(返回所有雇员)

这里返回的所有实例,且是全部的属性(字段)

ICriteria crt = _session.CreateCriteria(typeof(Employees));           

return crt.List<Employees>();

Isession创建条件查询实例有4个构造方法。

(二)  返回部分实例(返回2个雇员)

ICriteria crt = _session.CreateCriteria(typeof(Employees));

        crt.SetMaxResults(2);

return crt.List<Employees>();

(三)条件查询的约束条件

(1)Expression

ICriteria crt = _session.CreateCriteria(typeof(Employees));

        crt.Add(Expression.Eq("City","London"));

        return crt.List<Employees>();

       查询内容为:雇员的城市是在伦敦的。其中Expression的名字空间为:NHibernate.Criterion

Expression类 定义了获得某些内置ICriterion类型的工厂方法,这里用到了等于

(2)Restrictions

ICriteria crt = _session.CreateCriteria(typeof(Employees));

        crt.Add(Restrictions.Eq("City", "London"));

return crt.List<Employees>();

查询内容为:雇员的城市是在伦敦的。其中Restrictions的名字空间为:NHibernate.Criterion

(3)通过实例来查询

Employees ee = new Employees { City = "London", BirthDate = Convert.ToDateTime("1955-03-04 00:00:00.000") };

         ICriteria crt = _session.CreateCriteria(typeof(Employees));

         crt.Add(Example.Create(ee));

     return crt.List<Employees>();

查询伦敦的,生日在那个时间的。(为什么这里我要加个生日上去?因为我的持久类中有这个属性,如果在实例查询中不给定这个值,会有日期越界的异常。在下边的例子中,来处理这种情况)这是限制的相等的实现。下边实现一个相似的例子:

Employees ee = new Employees { FirstName = "a"};

    Example exp=Example.Create(ee)

                .EnableLike(MatchMode.Start)

                .ExcludeProperty("BirthDate")

                .IgnoreCase();

    ICriteria crt = _session.CreateCriteria(typeof(Employees));

    crt.Add(exp);

return crt.List<Employees>();

这个例子中,指定相似的姓名等a,看实例exp:

·采用相似比较EnableLike

·相似比较匹配模式MatchMode.Start,开头匹配,这个应该类似于SQL中的a%

·排除比较属性ExcludeProperty,这个方法就是用于处理排除的。上个例子中日期没给,所以会出现异常,而这个方法则排除了这种异常发生(其实就是排除不比较的属性(字段))。

·忽略大小写

(四)排序

ICriteria crt = _session.CreateCriteria(typeof(Employees));

crt.AddOrder(new NHibernate.Criterion.Order("FirstName", true));

return crt.List<Employees>();

排序字段:名字,升序(true)

(五)聚合

(1)查询人数

ICriteria crt = _session.CreateCriteria(typeof(Employees));

         crt.SetProjection(Projections.RowCount());

return crt.List();

NHibernate.Expression.Projections是 IProjection 的实例工厂。通过调用 SetProjection()应用投影到一个查询。

(2)Avg

从这个开始到以下的例子又回到以Products为示例数据表

       ICriteria crt = _session.CreateCriteria(typeof(Products));           

         crt.SetProjection(Projections.ProjectionList()

                .Add(Projections.Avg("Price"))

                );

     return crt.List();

通过投影列表来添加投影聚合方法。

这里取得产品的平均价格,这里没有条件约束,下边这个例子取得产品类别为2的产品的平均价格:

ICriteria crt = _session.CreateCriteria(typeof(Products));           

         crt.SetProjection(Projections.ProjectionList()

                .Add(Projections.Avg("Price")))

                .Add(Expression.Eq("CategoryID",2));

    return crt.List();

(3)Max(最大价格)

ICriteria crt = _session.CreateCriteria(typeof(Products));

         crt.SetProjection(Projections.ProjectionList()

                .Add(Projections.Max("Price")));

     return crt.List();

(4)Min(最低价格)

ICriteria crt = _session.CreateCriteria(typeof(Products));

         crt.SetProjection(Projections.ProjectionList()

                .Add(Projections.Min ("Price")));

     return crt.List();

(5)Sum(和)

ICriteria crt = _session.CreateCriteria(typeof(Products));

         crt.SetProjection(Projections.ProjectionList()

                .Add(Projections.Sum ("Price")));

     return crt.List();

(6)分组

ICriteria crt = _session.CreateCriteria(typeof(Products));

         crt.SetProjection(Projections.ProjectionList()

                .Add(Projections.GroupProperty("CategoryID")));

     return crt.List<int>();

这个分组只是返回一个属性,所以用int泛型可以了。下边的例子返回分组,并返回各组的数目

ICriteria crt = _session.CreateCriteria(typeof(Products));

    crt.SetProjection(Projections.ProjectionList()

                .Add(Projections.GroupProperty("CategoryID"))

                .Add(Projections.RowCount()));

return crt.List();

·这里的List为System.Collections.Ilist,且是object[]类型的

转自:http://www.cnblogs.com/360S/archive/2011/09/28/2193910.html

目录
相关文章
|
分布式计算 DataWorks 数据处理
DataWorks如何更改odps表生命周期为永久?
【2月更文挑战第14天】DataWorks如何更改odps表生命周期为永久?
654 2
|
安全 JavaScript 前端开发
JDK1.8的重要的新特性与功能
Java Development Kit (JDK) 1.8,也称为Java 8,是Java平台的一个重大更新,于2014年3月发布。它引入了多项新特性、新的API和性能提升
1162 3
|
10月前
|
运维 负载均衡 网络协议
OSPF的主要特点与优势
OSPF的主要特点与优势
919 0
|
11月前
|
存储 前端开发 JavaScript
useRef 钩子使用技巧
【10月更文挑战第12天】本文详细介绍了 React 中的 `useRef` Hook,包括其基础概念、基本用法、常见问题与易错点以及如何避免这些问题。通过具体代码示例,解释了 `useRef` 的应用场景,如保存对 DOM 元素的引用、保存回调函数和定时器 ID 等,帮助开发者更有效地使用这一工具。
373 14
|
11月前
|
CDN
阿里云国际版CDN网页打不开、页面报错该如何解决?
阿里云国际版CDN网页打不开、页面报错该如何解决?
|
机器学习/深度学习 编解码 并行计算
深度学习的图像超分技术综述-输入单张图像(SISR)和输入多张图像的基于参考的图像(RefSR)
深度学习的图像超分技术综述-输入单张图像(SISR)和输入多张图像的基于参考的图像(RefSR)
673 0
支付宝预授权集成流程
一、文档地址 官方文档地址:[url]https://docs.open.alipay.com/20180417160701241302[/url] 二、开发前准备工作 1、签约:[url]https://openclub.
4531 12
|
弹性计算 Linux 数据安全/隐私保护
阿里云服务器远程登录用户名和密码的查询方法
阿里云服务器远程连接登录用户名和密码在哪查看?阿里云服务器默认密码是什么?云服务器系统不同默认用户名不同