NHibernate说探——Criteria条件查询

简介: 条件查询 NHibernate.ICriteria接口表示特定持久类的一个查询。ISession是 ICriteria实例的工厂。   这里以Northwind数据库为示例数据库 示例数据表:Employees 现在只用雇员表中部分字段。

条件查询

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 name="Employees" table="Employees">

    <id name="EmployeeID" column="EmployeeID">

      <generator class="identity"></generator>

    </id>

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

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

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

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

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

    <property name="PostalCode" 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>();

三)条件查询的约束条件

1Expression

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

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

        return crt.List<Employees>();

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

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

2Restrictions

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()应用投影到一个查询。

2Avg

从这个开始到以下的例子又回到以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();

3Max(最大价格)

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

         crt.SetProjection(Projections.ProjectionList()

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

     return crt.List();

4Min(最低价格)

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

         crt.SetProjection(Projections.ProjectionList()

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

     return crt.List();

5Sum(和)

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();

·这里的ListSystem.Collections.Ilist,且是object[]类型的

 

 

 

博客园大道至简

http://www.cnblogs.com/jams742003/

转载请注明:博客园

目录
相关文章
|
6天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
17天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1320 7
|
5天前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
本文讲解 Prompt 基本概念与 10 个优化技巧,结合学术分析 AI 应用的需求分析、设计方案,介绍 Spring AI 中 ChatClient 及 Advisors 的使用。
296 129
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
|
4天前
|
监控 JavaScript Java
基于大模型技术的反欺诈知识问答系统
随着互联网与金融科技发展,网络欺诈频发,构建高效反欺诈平台成为迫切需求。本文基于Java、Vue.js、Spring Boot与MySQL技术,设计实现集欺诈识别、宣传教育、用户互动于一体的反欺诈系统,提升公众防范意识,助力企业合规与用户权益保护。
|
16天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1392 87
|
4天前
|
JavaScript Java 大数据
基于JavaWeb的销售管理系统设计系统
本系统基于Java、MySQL、Spring Boot与Vue.js技术,构建高效、可扩展的销售管理平台,实现客户、订单、数据可视化等全流程自动化管理,提升企业运营效率与决策能力。
|
5天前
|
人工智能 Java API
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
本文介绍AI大模型的核心概念、分类及开发者学习路径,重点讲解如何选择与接入大模型。项目基于Spring Boot,使用阿里云灵积模型(Qwen-Plus),对比SDK、HTTP、Spring AI和LangChain4j四种接入方式,助力开发者高效构建AI应用。
279 122
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)